分享
 
 
 

Oracle常用的OCI函数

王朝oracle·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

一. Oracle oci工具包安装:

$ORACLE_HOME\BIN:执行文件和help文件

$ORACLE_HOME\OCI\INCLUDE:头文件

$ORACLE_HOME\OCI\LIB\BC: for Borlanf C++的OCI库

$ORACLE_HOME\OCI\LIB\MSVC: for MS Visual C++的OCI库

如果是unix下,对于ORACLE8i,则OCI库在$ORACLE_HOME/lib下,如果是9i,则在$ORACLE_HOME/lib32下,库文件名一般为libclntsh.so

1. 创建OCI环境即创建和初始化OCI工作环境,其他的OCI函数需要OCI环境才能执行。

2. 需要申请的句柄类型:

OCI环境句柄: OCI_HTYPE_ENV—它定义所有OCI函数的环境调用环境,是其他句柄的父句柄。(由OCIEnvInit或OCIEnvCreate生成)

错误句柄:OCI_HTYPE_ERROR—作为一些OCI函数的参数,用来记录这些OCI函数操作过程中所产生的错误,当有错误发生时,可用COIErrorGet()来读取错误句柄 中记录的错误信息。

服务器环境句柄:OCI_HTYPE_SVCCTX—定义OCI调用的服务器操作环境,它包含服务器、用户会话和事务三种句柄。

服务器句柄:OCI_HTYPE_SERVER—标识数据源,它转换为与服务器的物理连接。

用户会话句柄:OCI_HTYPE_SESSION—定义用户角色和权限及OCI调用的执行环境。

事务句柄:OCI_HTYPE_TRANS—定义执行SQL操作的事务环境,事务环境中包含用户的会话状态信息。

语句句柄:OCI_HTYPE_STMT—是一个标识SQL语句或PL/SQL块,以及其相关属性的环境。

Bind/Define句柄:属于语句句柄的子句柄,由OCI库隐式自动生成。用户不需要自己再申请,OCI输入变量存储在bind 句柄中,输出变量存储在定义句柄中

3. 句柄属性包括:

服务器环境句柄属性:(OCI_HTYPE_SVCCTX)

OCI_ATTR_SERVER—设置/读取服务环境的服务器环境属性

OCI_ATTR_SESSION—设置/读取服务环境的会话认证环境属性

OCI_ATTR_TRANS—设置/读取服务环境的事务环境属性

用户会话句柄属性:(OCI_HTYPE_SESSION)

OCI_ATTR_USERNAME—设置会话认证所使用的用户名

OCI_ATTR_PASSWORD—设置会话认证所使用的用户口令

服务器句柄:(OCI_HTYPE_SEVER)

OCI_ATTR_NOBLOCKING_MODE—设置/读取服务器连接:=TRUE时服务器连接设置为非阻塞方式

语句句柄:(OCI_HTYPE_STMT)

OCI_ATTR_ROW_COUNT—只读,为当前已处理的行数,其default=1

OCI_ATTR_STMT_TYPE—读取当前SQL语句的类型:

Eg : OCI_STMT_BEGIN

OCI_STMT_SELECT OCI_STMT_INSERT

OCI_STMT_UPDATE OCI_STMT_DELETE

OCI_ATTR_PARAM_COUNT—返回语句选择列表中的列数

4. 关于输出变量定义:如果在语句执行前就知道select语句的选择列表结构,则定义输出操作可在调用 OCISTMTExecute前进行,如果查询语句的参数为用户动态输入的,则必须在执行后定义。

5. OCI函数返回值:

OCI_SUCCESS –函数执行成功 (=0)

OCI_SUCCESS_WITH_INFO –执行成功,但有诊断消息返回,可能是警告信息

OCI_NO_DATA—函数执行完成,但没有其他数据

OCI_ERROR—函数执行错误

OCI_INVALID_HANDLE—传递给函数的参数为无效句柄,或传回的句柄无效

OCI_NEED_DATA—需要应用程序提供运行时刻的数据

OCI_CONTINUE—回调函数返回代码,说明回调函数需要OCI库恢复其正常的处理操作

OCI_STILL_EXECUTING—服务环境建立在非阻塞模式,OCI函数调用正在执行中。

6. OCI连接有二种方式:Blocking(阻塞方式)和non_Blocking(非阻塞方式),阻塞方式就是当调用 OCI操作时,必须等到此OCI操作完成后服务器才返回客户端相应的信息,不管是成功还是失败。非阻塞方式是当客户端提交OCI操作给服务器后,服务器立即返回OCI_STILL_EXECUTING信息,而并不等待服务端的操作完成。

对于non-blocking方式,应用程序若收到一个OCI函数的返回值为 OCI_STILL_EXECUTING时必须再次对每一个OCI函数的返回值进行判断,判断其成功与否。

可通过设置服务器属性为OCI_ATTR_NONBLOCKING_MODE来实现。系统默认方式为阻塞模式.

7. OCI函数设置的模式有:

OCI_DEFUALT:使用OCI默认的环境

OCI_THREADED:线程环境下使用OCI

OCI_OBJECT:对象模式

OCI_SHARED:共享模式

OCI_EVENTS

OCI_NO_UCB

OCI_ENV_NO_MUTEX:非互斥访问模式

其中模式可以用逻辑运算符进行迭加,将函数设置成多多种模式:如mode=OCI_SHREADED| OCI_OBJECT

8. 当应用进程与服务器断开连接时,程序没有使用OCITransCommit()进行事务的提交,则所有活动的事务会自动回滚。

9. OCI重定义数据类型

typedef unsigned char ub1;

typedef signed char sb1;

typedef unsigned short ub2;

typedef signed short sb2;

typedef unsigned int ub4;

typedef signed int sb4;

typedef ub4 duword;

typedef sb4 dsword;

typedef dsword dword;

10. 在SQL语句准备后,可以用OCIAttrSet(0设置该语句的类型属性OCI_ATTR_STMT_TYPE,以后可读取语句属性,根据属性分别进行处理。

11. 批量绑定输入和定义输出参数:将数据存入一个静态数据组中。一次执行可以提交或读取多行记录值。

12. 结合占位符和指示器变量:

占位符:在程序中,一些SQL语句需要在程序运行时才能确定它的语句数据,在设计时可用一个占位符来代替,当程序运行时,在它准备好语句后,必须为每个占位符指定一个变量,即将占位符与程序变量地址结合,执行时,Oracle就从这些变量中读取数据,并将它们与SQL语句一起传递给Oracle服务器执行。OCI结合占位符时,它将占位符与程序变量关联起来,并同时要指出程序变量的数据类型和数据长度。

如:select * from test where name=:p1 and age>:p2

:p1和:p2为占位符

指示器变量:由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数允许程序为所执行语句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为NULL或所读取的列值是否为NULL,以及所读取的列值是否被截取。

除SQLT_NTY(SQL Named DataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明:

作为输入变量时:(如insert ,update语句中)

=-1:OCI程序将NULL赋给Oracle表的列,忽略占位符结合的程序变量值

>=0:应用程序将程序变量值赋给指定列

作为输出变量时:(如select语句中)

=-2:所读取的列数据长度大于程序变量的长度,则被截取。

=-1:所读取的值为NULL,输出变量的值不会被改变。

=0:数据被完整读入到指定的程序变量中

>0:所读取的列数据长度大于程序变量的长度,则被截取,指示符变量值为所读取数据被截取前的实际长度

三. OCI函数说明

注:红色为输入参数 蓝色为输出参数 ,否则为输入/出参数

示例以下面结构作为说明

sword swResult;

OCIBind* hBind;

OCIDefine* hDefine;

OCIStmt *stmtp

OCIError *errhp;

OCIStmt *stmtp

OCISvcCtx * svchp

OCIEnv * envhpp;

OCISession * usrhp;

sb2 sb2aInd[30]; //指示器变量,用于取可能存在空值的字段

Typedef strcut

{

char tname[40];

int age;

} t_std;

typedef struct

{

sb2 sb2_tname[100];

sb2 sb2_age[100];

} stdInd_T; //指示器数组

typedef struct

{

ub2 ub2_tname[100];

ub2 ub2_age[100];

} stdLen_T; //字段长度

t_std tstd[100]; //数组变量,用于批量操作

stdInd_T tstdInd;

stdLen_T tstdLen;

stdLen_T tstdRet;

t_std std;

各函数数明

1.创建OCI环境

sword OCIEnvCreate(

OCIEnv **envhpp, //OCI环境句柄指针

ub4 mode, //初始化模式:OCI_DEFAULT/OCI_THREADED 等

CONST dvoid *ctxp,

CONST dvoid *(*malicfp)(dvoid *ctxp,size_t size),

CONST dvoid *(ralocfp)(dvoid *ctxp,dvoid *memptr,size_t newsize),

CONST void *(*mfreefp)(dvoid *ctxp,dvoid *memptr),

Size_t xstramemsz,

Dvoid **usrmempp

)

eg :

swResult = OCIEnvCreate(&envhpp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);

if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)

return FALSE;

sword OCIInitialize (

ub4 mode,

CONST dvoid *ctxp,

CONST dvoid *(*malocfp) (/* dvoid *ctxp, size_t size _*/),

CONST dvoid *(*ralocfp) (/*_ dvoid *ctxp, dvoid *memptr, size_t newsize _*/),

CONST void (*mfreefp) (/*_ dvoid *ctxp, dvoid *memptr _*/)

);

sword OCIEnvInit (

OCIEnv **envhpp,

ub4 mode,

size_t xtramemsz,

dvoid **usrmempp

);

注:

在8i以后,可用OCIEnvCreate一个函数就可以初始化环境了,相当于OCIInitialize+ OCIEnvInit

2.申请/释放句柄

sword OCIHandleAlloc(

CONST dvoid *parenth, //新申请句柄的父句柄,一般为OCI环境句柄

Dvoid **hndlpp, //申请的新句柄

Ub4 type, type, //句柄类型

Size_t xtramem_sz, //申请的内存数

Dvoid **usrmempp //申请到的内存块指针

)

[1] [2] [3] [4] [5] [6] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有