Oracle OCI操作UDT相关学习
1、Oracle数据类型
Oracle的数据类型如下
字符串类型 char nchar varchar2 nvarchar2
数值类型 int number integer smallint
日期类型 date timestamp
自定义类型 create type
这里UDT表示的就是oracle自定义类型,语法如下
CREATE TYPE xxx as object (字段1 类型1, 字段2 类型2, ...);
如下创建了一个自定义类型 addr_type

该类型可以应用到表的某个列,创建了一个 cust 表

这个表中有两个字段,一个基本类型的id字段,一个为ADDR_TYPE类型的addr字段。
2、SQL相关
插入数据SQL

执行查询操作:
select * from cust;

这里ADDR的值,需要点击sqldeveloper 的对应列表,才能看到其值。

3、OCI相关
3.1 select 相关
在使用OCI操作自定义类型之前,需要通过OTT工具来对类型进行转换,并将生成的头文件和c文件加入到OCI的源码工程中,具体OTT相关操作请参考 Oracle OTT 学习 一文。

1)进行OCI环境变量的初始化并分配各个句柄,这里对这些操作进行了封装,其中调用OCIEnvCreate 函数的参数mode 必须有 OCI_OBJECT 模式来支持自定义类型。
2)调用OTT生成的C函数进行初始化
3)连接数据库,这里也对其进行了封装
4)准备sql语句
备注:这里addr_type* at 声明的at变量是由OTT自动生成的。 在声明时最好赋空值,如addr_type* at = NULL;


5)绑定输出变量 id
6)绑定输出变量 addr 这里绑定自定义变量需要两步(或者理解为3步)
6.1 先用SQLT_NTY参数调用 OCIDefineByPos
6.2 然后调用OCIDefineObject 来绑定at 变量,这个at变量是一个结构体,上边有介绍。
绑定完成后,即可execute并fetch出结果。

7)调用OCIStmtExecute 执行语句
8)循环调用OCIStmtFetch 来获取数据
执行程序结果如下:

3.2 insert 操作
3.2.1 用OTT生成的结构体来操作

1)初始化OCI环境及句柄
2)对结构体addr内容进行赋值
3)连接数据库

4)准备sql语句,这里采用绑定的方式
5)对自定义类型进行绑定同select 中的方式。

6)执行sql语句,并进行相关句柄回收等操作。
备注:在前边给结构体中的变量赋值之前,必须对其进行初始化为0,否则程序报错。
这里重点是 自定义类型整体作为绑定变量来进行操作。
3.2.2 采用常规方式

1)声明变量,并初始化OCI环境及句柄
2)连接数据库
3)绑定变量,这里分别绑定各自变量,相当于把自定义类型拆开了。
4)执行sql 并最后释放句柄相关。
备注:这里采用了 ADDR_TYPE(:2,:3,:4,:5) 这种方式来实现。
Oracle OCI操作UDT相关学习的更多相关文章
- Oracle OCI操作UDT相关学习(二)
沿用 Oracle OCI操作UDT相关学习 一文中定义的类型和表. 1.更改数据 在sqldeveloper 中更新数据, update dxl.cust set addr.street='a11' ...
- oracle 中proc和oci操作对缓存不同处理
oracle 中proc和oci操作对缓存不同处理
- Oracle 参数文件及相关操作介绍
Oracle 参数文件及相关操作介绍 by:授客 QQ:1033553122 1.服务器参数文件 服务器参数文件是一个二进制文件,作为初始化参数的存储仓库.实例运行时,可用ALTER SYSTEM来改 ...
- [转]Oracle 树操作(select…start with…connect by…prior)
转自http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html Oracle 树操作(select-start with-conne ...
- 基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具
基于OCILIB的oracle数据库操作总结 1. 类图 2. 基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once /* ----- ...
- oracle 10g操作和维护手册
1. 检查数据库基本状况... 1.1. 检查Oracle实例状态... 1.2. 检查Oracle服务进程... 1.3. 检查Oracle监听状态... 2. ...
- Oracle 树操作
Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...
- DocX开源WORD操作组件的学习系列四
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- Windows7上完全卸载Oracle 12c操作步骤
注:本文来源于:< Windows7上完全卸载Oracle 12c操作步骤 > 1.关闭Oracle所有的服务,按[win+R]运行[services.msc]找到所有Oracle开头的 ...
随机推荐
- [ActionScript 3.0] AS利用ByteArray向PHP发送二进制数据生成图片
flash as3向php发送二进制数据,通过php保存成图片. AS端: package { import com.JPEGEncoder.JPGEncoder; import flash.disp ...
- 主流服务器虚拟化技术简单使用——Xen(二)
管理多台Xen主机可以使用GUI工具virt-manager和xm.xl等命令行工具. Tips:hypervisor一定要选到Xen web管理工具 Xen也有一个简易web管理工具叫xenwebm ...
- 使用IntelliJ IDEA 前最好修改的配置
目录 1.下载 2.破解 3.修改配置 下载 详见我的另外一篇博客:<软件开发资源下载>中的[IDE]->[IntelliJ IDEA] 破解 详见我的另外一篇博客:<最新版I ...
- A: Absolutely Simple---巴什博弈
A: Absolutely Simple 时间限制: 1 s 内存限制: 128 MB 题目描述 Ocean暑假去海边玩,海边有许多好看的贝壳.并且Ocean捡了好多回来. 回 ...
- python自动化 协程函数、二分查找、模块搜索
协程函数 yiled: 把函数的执行结果封装好__iter__和__next__得到一个迭代器 与return功能类似,都可以返回值,但是return只能返回一次只 def fun(count): p ...
- C++标准库类模板(stack)和 队列(queue)
在C++标准库(STL)中有栈和队列的类模板,因此可以直接使用 1.栈(stack):使用栈之前,要先包含头文件 : #include<stack> stack.push(elem); / ...
- SQL语句exists用法
首先头脑中有三点概念: 1 . EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2 . 建立程序循环的概念,这是一个动态的查 ...
- js中this那些事儿
前几天写东西由于恶趣味作祟将所有的函数全部封装在json中,起初好好的,函数B也可以调用函数A的内容,不过在写一个点击事件时出现了意外, 代码如下: var $ ={ "A":fu ...
- APP的功能分类及打包与发布的分类方式
智能手机的出现改变了我们的生活,同时各种各样的APP充斥在我们的手机当中.那么我先现在在来熟悉一下APP的分类及其用途:工具类.社交类.信息类.娱乐类.生活类等几大类.我么了解了APP的用途分类,那么 ...
- MySQL修改提示符
MySQL提示符 \D 完整日期 \d 当前数据库 \h 服务器名称 \u 当前用户 1.连接之前修改提示符 mysql -uroot -proot --prompt [MySQL提示符] 2.连接之 ...