常用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.so1.创建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=1OCI_ATTR_STMT_TYPE—读取当前SQL语句的类型:Eg:OCI_STMT_BEGINOCI_STMT_SELECTOCI_STMT_INSERTOCI_STMT_UPDATEOCI_STMT_DELETEOCI_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:线程环境下使用OCIOCI_OBJECT:对象模式OCI_SHARED:共享模式OCI_EVENTSOCI_NO_UCBOCI_ENV_NO_MUTEX:非互斥访问模式其中模式可以用逻辑运算符进行迭加,将函数设置成多多种模式:如mode=OCI_SHREADED|OCI_OBJECT8.当应用进程与服务器断开连接时,程序没有使用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*stmtpOCIError*errhp;OCIStmt*stmtpOCISvcCtx*svchpOCIEnv*envhpp;OCISession*usrhp;sb2sb2aInd[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+OCIEnvInit2.申请/释放句柄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_SVCCTXSQL语句句柄OCIStmt,句柄类型OCI_HTYPE_STMTeg:申请一个错误句柄OCIErrorswResult=OCIHandleAlloc(envhpp,(dvoid*)&errhp,OCI_HTYPE_ERROR,0,NULL);if(swResult!=OCI_SUC