OCI相关知识

网上很少有OCI的中文文档,一般英文文档大家可能看了也不太顺,我整理了一份,写了一些常用的OCI函数,供大家参考。
因为无法加附件,只好把内容贴上来了
一. Oracleoci工具包安装:
$ORACLE_HOME\BIN:执行文件和help文件
$ORACLE_HOME\OCI\INCLUDE:头文件
$ORACLE_HOME\OCI\LIB\BC:forBorlanfC++的OCI库
$ORACLE_HOME\OCI\LIB\MSVC:forMSVisualC++的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_SELECTOCI_STMT_INSERT
OCI_STMT_UPDATEOCI_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_SHREADEDOCI_OBJECT

8. 当应用进程与服务器断开连接时,程序没有使用OCITransCommit()进行事务的提交,则所有活动的事务会自动回滚。
9. OCI重定义数据类型
typedefunsignedcharub1;
typedefsignedcharsb1;
typedefunsignedshortub2;
typedefsignedshortsb2;
typedefunsignedintub4;
typedefsignedintsb4;
typedefub4duword;
typedefsb4dsword;
typedefdsworddword;

10. 在SQL语句预备后,可以用OCIAttrSet(0设置该语句的类型属性OCI_ATTR_STMT_TYPE,以后可读取语句属性,根据属性分别进行处理。
11. 批量绑定输入和定义输出参数:将数据存入一个静态数据组中。一次执行可以提交或读取多行记录值。
12. 结合占位符和指示器变量:
占位符:在程序中,一些SQL语句需要在程序运行时才能确定它的语句数据,在设计时可用一个占位符来代替,当程序运行时,在它预备好语句后,必须为每个占位符指定一个变量,即将占位符与程序变量地址结合,执行时,Oracle就从这些变量中读取数据,并将它们与SQL语句一起传递给Oracle服务器执行。OCI结合占位符时,它将占位符与程序变量关联起来,并同时要指出程序变量的数据类型和数据长度。
如:select*fromtestwherename=:p1andage>:p2
:p1和:p2为占位符

指示器变量:由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数答应程序为所执行语句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为NULL或所读取的列值是否为NULL,以及所读取的列值是否被截取。
除SQLT_NTY(SQLNamedDataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明:
作为输入变量时:(如insert,update语句中)
 =-1:OCI程序将NULL赋给Oracle表的列,忽略占位符结合的程序变量值
>=0:应用程序将程序变量值赋给指定列
作为输出变量时:(如select语句中)
=-2:所读取的列数据长度大于程序变量的长度,则被截取。
=-1:所读取的值为NULL,输出变量的值不会被改变。
=0:数据被完整读入到指定的程序变量中

>0:所读取的列数据长度大于程序变量的长度,则被截取,指示符变量值为所读取数据被截取前的实际长度
三. OCI函数说明
注:红色为输入参数蓝色为输出参数,否则为输入/出参数

示例以下面结构作为说明
swordswResult;
OCIBind*hBind;
OCIDefine*hDefine;
OCIStmt*stmtp
OCIError*errhp;
OCIStmt*stmtp
OCISvcCtx*svchp
OCIEnv*envhpp;
OCISession*usrhp;
sb2 sb2aInd[30];//指示器变量,用于取可能存在空值的字段
Typedefstrcut
{
chartname[40];
intage;
}t_std;
typedefstruct
{
sb2sb2_tname[100];
sb2sb2_age[100];
}stdInd_T;//指示器数组
typedefstruct
{
ub2ub2_tname[100];
ub2ub2_age[100];
}stdLen_T;//字段长度

t_stdtstd[100];//数组变量,用于批量操作
stdInd_TtstdInd;
stdLen_TtstdLen;
stdLen_TtstdRet;

t_stdstd;

各函数数明
1.创建OCI环境
swordOCIEnvCreate(
OCIEnv**envhpp,//OCI环境句柄指针
ub4mode,//初始化模式:OCI_DEFAULT/OCI_THREADED等
CONSTdvoid*ctXP,
CONSTdvoid*(*malicfp)(dvoid*ctxp,size_tsize),
CONSTdvoid*(ralocfp)(dvoid*ctxp,dvoid*memptr,size_tnewsize),
CONSTvoid*(*mfreefp)(dvoid*ctxp,dvoid*memptr),
Size_txstramemsz,
Dvoid**usrmempp
)
eg:
swResult=OCIEnvCreate(&envhpp,OCI_DEFAULT,NULL,NULL,NULL,NULL,0,NULL);

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

swordOCIInitialize(
ub4mode,
CONSTdvoid*ctxp,
CONSTdvoid*(*malocfp)(/*dvoid*ctxp,size_tsize_*/),
CONSTdvoid*(*ralocfp)(/*_dvoid*ctxp,dvoid*memptr,size_tnewsize_*/),

CONSTvoid(*mfreefp)(/*_dvoid*ctxp,dvoid*memptr_*/)
);

swordOCIEnvInit(
OCIEnv**envhpp,
ub4mode,
size_txtramemsz,
dvoid**usrmempp
);
注:
在8i以后,可用OCIEnvCreate一个函数就可以初始化环境了,相当于OCIInitialize+OCIEnvInit

2.申请/释放句柄
swordOCIHandleAlloc(
CONSTdvoid*parenth,//新申请句柄的父句柄,一般为OCI环境句柄
Dvoid**hndlpp,//申请的新句柄
Ub4type,type,//句柄类型
Size_txtramem_sz,//申请的内存数
Dvoid**usrmempp//申请到的内存块指针
)
注:
一般需要申请的句柄有:
服务器句柄OCIServer,句柄类型OCI_HTYPE_SERVER
错误句柄OCIError,用于捕捉OCI错误信息,句柄类型OCI_HTYPE_ERROR
事务句柄OCISession,句柄类型OCI_HTYPE_SESSION
上下文句柄OCISvcCtx,句柄类型OCI_HTYPE_SVCCTX
SQL语句句柄OCIStmt,句柄类型OCI_HTYPE_STMT
eg:申请一个错误句柄OCIError
swResult=OCIHandleAlloc(envhpp,(dvoid*)&errhp,OCI_HTYPE_ERROR,0,NULL);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
{

returnFALSE;
}

释放句柄
swordOCIHandleFree(
dvoid*hndlp,//要释放的句柄
ub4type//句柄类型
)

eg:
OCIHandleFree(stmtp,OCI_HTYPE_STMT)
3.读取/设置句柄属性
swordOCIAttrSet(
dvoid*trgthndlp,//需设置的句柄名
ub4trghndltyp, //句柄类型
dvoid*attributep,//设置的属性名
ub4size, //属性值长度
ub4attrtype,//属性类型
OCIError*errhp//错误句柄
)
注:一般要设置的属性有:
服务器实例:
句柄类型OCI_HTYPE_SVCCTX,属性类型OCI_ATTR_SERVER
连接数据的用户名:
句柄类型OCI_HTYPE_SESSION,属性类型OCI_ATTR_USERNAME
用户密码
句柄类型OCI_HTYPE_SESSION,属性类型OCI_ATTR_PASSWORD
事务:
句柄类型OCI_HTYPE_SVCCTX,属性类型OCI_ATTR_SESSION


eg:设置用户名和密码
charusername[20],passwd[20];
strcpy(username,”tiger”)
strcpy(passwd,”cotton”)
swResult=OCIAttrSet(usrhp,OCI_HTYPE_SESSION,(text*)username,strlen(username),
OCI_ATTR_USERNAME,errhp);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
returnFALSE;

swResult=OCIAttrSet(usrhp,OCI_HTYPE_SESSION,(text*)passwd,strlen(passwd),
OCI_ATTR_PASSWORD,errhp);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
returnFALSE;


swordOCIAttrGet(
dvoid*trgthndlp,//需读取的句柄名
ub4trghndltyp, //句柄类型
dvoid*attributep,//读取的属性名
ub4*sizep, //属性值长度
ub4attrtype,//属性类型
OCIError*errhp//错误句柄
)

4.连接/断开服务器
多用户方式连接:
swordOCIServerAttach(
OCIServer*srvhp,//未初始化的服务器句柄
OCIError*errhp,
CONSTtext*dblink,//服务器SID
sb4dblink_len,
ub4mode//=OCI_DEFAULT,系统环境将设为阻塞方式
);

swordOCIServerDetach(
OCIServer*srvhp,
OCIError*errhp,
ub4mode//OCI_DEFAULT
);
单用户方式连接:
swordOCILogon(
OCIEnv*envhp,
OCIError*errhp,

OCISvcCtx**svchp,
CONSTtext*username,
ub4uname_len,
CONSTtext*password,
ub4passwd_len,
CONSTtext*dbname,
ub4dbname_len
);

swordOCILogoff(
OCISvcCtx*svchp
OCIError*errhp
);

5.开始/结束一个会话
先认证用户再建立一个会话连接
swordOCISessionBegin(
OCISvcCtx*svchp,//服务环境句柄
OCIError*errhp,
OCISession*usrhp,//用户会话句柄
ub4credt,//认证类型
ub4mode//操作模式
);

*认证类型:
OCI_CRED_RDBMS:用数据库用户名和密码进行认证,则先要设置OCI_ATTR_USERNAME和OCI_ATTR_PASSWORD属性
OCI_CRED_EXT:外部认证,不需要设置用户和密码
OCI_DEFAULT:用户会话环境只能被指定的服务器环境句柄所设置
OCI_SYSDBA:用户要具有sysdba权限
OCI_SYSOPER:用户要具有sysoper权限


Eg:

swResult=OCISessionBegin(svchp,errh,usrhp,OCI_CRED_RDBMS,OCI_DEFAULT);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
returnFALSE;


swordOCISessionEnd(
OCISvcCtx*svchp,
OCIError*errhp,
OCISession*usrhp,
ub4mode);
6.读取错误信息
swordOCIErrorGet(
dvoid*hndlp,//错误句柄
ub4recordno,//从那里读取错误记录,从1开始
text*sqlstate,//已取消,=NULL
sb4*errcodep,//错误号
text*bufp,//错误内容
ub4bufsiz,//bufp长度
ub4type//传递的错误句柄类型
=OCI_HTYPE_ERROR:错误句柄
=OCI_HTYPE_ENV:环境句柄
);
eg:
ub4ub4RecordNo=1;
OCIError*hError
sb4sb4ErrorCode;
charsErrorMsg[1024];

if(OCIErrorGet(hError,ub4RecordNo++,NULL,&sb4ErrorCode,(OraText*)sErrorMsg,sizeof(sErrorMsg),OCI_HTYPE_ERROR)==OCI_SUCCESS)
printf(“errormsg:%s\n”,sErrorMsg);


7.预备SQL语句
swordOCIStmtPrepare(
OCIStmt*stmtp,//语句句柄

OCIError*errhp,
CONSTtext*stmt,//SQL语句
ub4stmt_len,//语句长度
ub4language,//语句的语法格式=OCI_NTV_SYNTAX
ub4mode//=OCI_DEFAULT
);

eg:
charsSQL[1024];

sprintf(sSQL,“selecttable_namefromuser_tables”);

swResult=OCIStmtPrepare(stmtperrhp,(CONSTOraText*)sSQL,strlen(sSQL),OCI_NTV_SYNTAX,OCI_DEFAULT);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
returnFALSE;




8.绑定输入参数

OCIBindArrayOfStruct() Setskipparametersforstaticarraybind,数组绑定,一般用于批量操作
OCIBindByName() Bindbyname按名绑定
OCIBindByPos() Bindbyposition按位置绑定,建议一般按此方式绑定
OCIBindDynamic() SetsadditionalattributesafterbindwithOCI_DATA_AT_EXECmode
OCIBindObject() Setadditionalattributesforbindofnameddatatype

注:
OCIBindArrayOfStruct必须先用OCIBindByPos初始化,然后在OCIBindArrayOfStruct中定义每个参数所跳过的字节数。
如:

存储方式:



第一条记录第二条记录 N


SkipPara(实际就是结构体长度,即本次所有列的长度和)



swordOCIBindByName(
OCIStmt*stmtp,//语句句柄
OCIBind**bindpp,//结合句柄,=NULL
OCIError*errhp,
CONSTtext*placeholder,//占位符名称
sb4placeh_len,//占位符长度

dvoid*valuep,//绑定的变量名
sb4value_sz,//绑定的变量名长度
ub2dty,//绑定的类型
dvoid*indp,//指示符变量指针(sb2类型),单条绑定时为NULL,
ub2*alenp,//说明执行前后被结合的数组变量中各元素数据实际的长度,单条绑定时为NULL
ub2*rcodep,//列级返回码数据指针,单条绑定时为NULL
ub4maxarr_len,//最多的记录数,假如是单条绑定,则为0
ub4*curelep,//实际的记录数,单条绑定则为NULL
ub4mode//=OCI_DEFAULT
);

swordOCIBindByPos(OCIStmt*stmtp,
OCIBind**bindpp,
OCIError*errhp,
ub4position,//绑定的位置
dvoid*valuep,
sb4value_sz,
ub2dty,

dvoid*indp,
ub2*alenp,
ub2*rcodep,
ub4maxarr_len,
ub4*curelep,
ub4mode);

swordOCIBindArrayOfStruct(
OCIBind*bindp,//绑定的结构句柄,由OCIBindByPos定义
OCIError*errhp,
ub4pvskip,//下一列跳过的字节数**
ub4indskip,//下一个指示器或数组跳过的字节数
ub4alskip,//下一个实际值跳过的字节数
ub4rcskip//下一个列级返回值跳过的字节数
);

例:
swordswResult;
OCIBind*hBind;
Ub4rec_num;
Sql:insertintostudentvalues(:p1,:p2)

单条绑定:
hBind=NULL;
swResult=OCIBindByPos(stmtp&hBind,errhp,1,ststd.tname,
sizeof(ststd.tname), SQLT_CHR,NULL,
NULL,NULL,0,NULL,OCI_DEFAULT);


批量取数据,一次取100条
Sql:selectusername,agefromstudentwhereusername=:p1andage=:p2

hBind=NULL;
swResult=OCIBindByPos(stmtp&hBind,errhp,1,tstd[0].tname,

sizeof(tstd[0].tname), SQLT_CHR,&tstdInd.sb2_usernmae[0],
&tstdLen.ub2_username[0],&tstdRet.ub2_username[0],100,&rec_num,OCI_DEFAULT);
swResult=OCIBindArrayOfStruct(hBind,errhp,sizeof(tstd[0]),sizeof(sb2),sizeof(ub2),sizeof(ub2));

9.执行SQL语句
swordOCIStmtExecute(
OCISvcCtx*svchp,//服务环境句柄
OCIStmt*stmtp,//语句句柄
OCIError*errhp,
ub4iters,//**
ub4rowoff,//**
CONSTOCISnapshot*snap_in,
OCISnapshot*snap_out,
ub4mode//**
);
**注:
1. iters:对于select语句,它说明一次执行读取到buffer中的记录行数,假如不能确定select语句所返回的行数,可将iters设置为0,而对于其他的语句,iters表示这些语句的执行次数,此时iters不能为0。
2. rowoff:在多行执行时,该参数表示从所结合的数据变量中的第几条记录开始执行(即记录偏移量)。
3. mode:=OCI_DEFAULT:default模式
=OCI_DESCRIBE_ONLY:描述模式,只返回选择列表的描述信息,而不执行语句
=OCI_COMMIT_ON_SUCCESS:自动提交模式,当执行成功后,自动提交。
=OCI_EXACT_FETCH:精确提取模式。
=OCI_BATCH_ERRORS:批错误执行模式:用于执行数组方式的操作,在此模式下,批量insert,update,delete时,执行过程中任何一条记录错误不会导致整个insert,update,delete失败,系统自动会收集错误信息,而在非批错误方式下,其中的任何一条记录错误,将会导致整个操作失败。
Eg:
执行一次
swResult=OCIStmtExecute(svchp,stmtp,errhp;,
1,0,NULL,NULL,OCI_DEFAULT);

批量执行100次:
swResult=OCIStmtExecute(svchp,stmtp,errhp;,
100,0,NULL,NULL,OCI_DEFAULT);

10.定义输出变量

OCIDefineArrayOfStruct() Setadditionalattributesforstaticarraydefine
OCIDefineByPos() Defineanoutputvariableassociation
OCIDefineDynamic() SetsadditionalattributesfordefineinOCI_DYNAMIC_FETCHmode
OCIDefineObject() Setadditionalattributesfordefineofnameddatatype

swordOCIDefineByPos(
OCIStmt*stmtp,//语句句柄
OCIDefine**defnpp,//定义句柄—用于数组变量
OCIError*errhp,
ub4position,//位置序号(从1开始)
dvoid*valuep,//输出的变量名
sb4value_sz,//变量长度
ub2dty,//数据类型
dvoid*indp,//指示器变量/指示器变量数组,假如此字段可能存在空值,则要指示器变量,否则单条处理时为NULL
ub2*rlenp,//提取的数据长度
ub2*rcodep,//列级返回码数组指针
ub4mode//OCI_DEFAULT

);




swordOCIDefineArrayOfStruct(
OCIDefine*defnp,//由OCIDefineByPos定义的句柄
OCIError*errhp,
ub4pvskip,//下一列跳过的字节数,一般就是结构的大小
ub4indskip,//下一个指示器或结构跳过的字节数,=0
ub4rlskip,//下一个实际值跳过的字节数,=0
ub4rcskip//下一个列列级返回值跳过的字节数,=0
);

swordOCIDefineDynamic(
OCIDefine*defnp,
OCIError*errhp,
dvoid*octxp,
OCICallbackDefine(ocbfp)(/*_
dvoid*octxp,
OCIDefine*defnp,
ub4iter,
dvoid**bufpp,
ub4**alenpp,

ub1*piecep,
dvoid**indpp,
ub2**rcodep_*/));

swordOCIDefineObject(OCIDefine*defnp,
OCIError*errhp,
CONSTOCIType*type,
dvoid**pgvpp,
ub4*pvszsp,
dvoid**indpp,
ub4*indszp);

eg:
单条查询
sql:selectusername,agefromstudentwhereusername=:p1;
假如此字段有可能有空值,则
hDefine=NULL;
swResult=OCIDefineByPos(stmtp&hDefine,errhp,1,tstd.username,sizeof(tstd.username),SQLT_CHR,&sb2aInd[0],NULL,NULL,OCI_DEFAULT);
假如此字段没有空值,则
hDefine=NULL;
swResult=OCIDefineByPos(stmtp&hDefine,errhp,1,tstd.username,sizeof(tstd.username),SQLT_CHR,NULL,NULL,NULL,OCI_DEFAULT);


批量查询
selectusername,agefromstudentwhereage>30;
hDefine=NULL;
swResult=OCIDefineByPos(stmtp,&hDefine,errhp,1,&tstd[0].username,
sizeof(tstd[0].usenmae),SQLT_CHR,NULL,NULL,NULL,OCI_DEFAULT);

swResult=OCIDefineArrayOfStruct(hDefine,errhp,sizeof(tstd[0]),0,0,0);
11.提取结果
swordOCIStmtFetch(
OCIStmt*stmtp,//语句句柄
OCIError*errhp,
ub4nrows,//从当前位置处开始一次提取的记录数,对于数据变量,可以>1,否则不能>1
ub2orientation,//提取的方向:OCI_FETCH_NEXT
ub4mode//OCI_DEFAULT
)

eg
while((swResult=OCIStmtFetchstmtperrhp,1,OCI_FETCH_NEXT,OCI_DEFAULT))!=OCI_NO_DATA)
{
……
}

12.事务操作
开始一个事务
swordOCITransStart(
OCISvcCtx*svchp,
OCIError*errhp,
uwordtimeout,//**
ub4flags);
**注:
1. Timeout:
当flag=OCI_TRANS_RESUME:它表示还有多少秒事务将被激活
=OCI_TRANS_NEW:事务响应的超时时间(秒)
2. Flags:指定一个新的事务还是已有事务
=OCI_TRANS_NEW:定义一个新的事务
=OCI_TRANS_RESUME

预备一个事务:
swordOCITransPrepare(
OCISvcCtx*svchp,
OCIError*errhp,
ub4flags);//OCI_DEFAULT


swordOCITransForget(
OCISvcCtx*svchp,
OCIError*errhp,
ub4flags);//OCI_DEFAULT

断开一个事务:
swordOCITransDetach(
OCISvcCtx*svchp,
OCIError*errhp,
ub4flags);//OCI_DEFAULT

提交一个事务:
swordOCITransCommit(
OCISvcCtx*svchp,//服务环境句柄
OCIError*errhp,
ub4flags);//OCI_DEFAULT
回滚一个事务
swordOCITransRollback(
dvoid*svchp,
OCIError*errhp,
ub4flags);//OCI_DEFAULT


四. OCI数据类型与C语言数据类型对照表
表字段类型      OCI类型 C类型 备注
Number(N) SQLT_UIN  int 无符号整型
Number(N) SQLT_INT  int 有符号整型
Number(n,m) SQLT_FLT  float 符点数
Varchar2(N) Sqlt_chr  Char 字符串
Raw(N)   Sqlt_BIN 具体看不同的定义 二进制类型,多用于一个结构字段
DATE SQLT_DAT 无 最好转换成字符串或数字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值