OCI常用函数的函数说明

作者&投稿:佼试 (若有异议请与网页底部的电邮联系)
OCI常用函数的大致步骤~

一、 定义并初始化所需各变量envhp、srvhp、errhp、svchp、authp、hndlp、stmthp、等等二、连接数据库1、 OCIInitialize。初始化OCI程序环境2、OCIEnvInit。 初始化OCI环境句柄3、 OCIHandleAlloc。分配各句柄,需要分配的句柄类型如下:OCI_HTYPE_SVCCTX,OCI_HTYPE_ERROR,OCI_HTYPE_SESSION,OCI_HTYPE_SERVER,4、 OCIServerAttach。指定资料源路径5、 OCIAttrSet。设置各项参数。需要设置的参数类型如下:OCI_ATTR_SERVER 使用的句柄型为OOCI_HTYPE_SVCCTXOCI_ATTR_USERNAMEOCI_ATTR_PASSWORD上面两个参数使用的句柄类型为OCI_HTYPE_SESSION6、 OCISessionBegin。创建并开始会话7、 OCIAttrSet。设置会话参数类型OCI_ATTR_SESSION,使用句柄为OCI_HTYPE_SVCCTX8、 OCIHandleAlloc。分配OCI_HTYPE_STMT型陈述句柄三、操作数据库1、OCIStmtPrepare。准备事件处理2、OCIBindByPos、OCIBindByName(OCIDefineByPos)绑定(定义)变量。如果是多行资料,则需要使用OCIBindArrayOfStruct(OCIDefineArrayOfStruct)函数来绑定(定义)存放该数据的数组3、OCIStmtExecute。执行SQL语句4、OCITransCommit(OCITransRollback)。提交(回滚)当前事务四、断开数据库1、OCISessionEnd。结束会话2、OCIServerDetach。断开与服务器的连接3、OCIHandleFree。释放已分配的各句柄。需要释放的句柄如下:OCI_HTYPE_SVCCTX,OCI_HTYPE_ERROR,OCI_HTYPE_SESSION,OCI_HTYPE_SERVER,OCI_HTYPE_STMTOCI_HTYPE_ENV五、提取出错描述信息1、OCIErrorGet。上述各函数若执行失败,都可以使用该函数来提取出错信息的ORCALE描述。

一、开始前的准备工作
在使用OTL进行编程之前,要首先确定使用的Oralce版本以及所选用的字符集。OTL支持目前几乎所有的主流数据库,可以通过宏启用otlv4.h中对应的数据库操作接口。
如:使用Oracle 11g R2、字符集选择UTF8,则可在包含otlv4.h之前声明以下两个宏:
#define OTL_ORA11G_R2
#define OTL_ORA_UTF8
#include "otlv4.h"
....
二、常用类及其常用成员
1. otl_connect类
static int otl_initialize(const int threaded_mode=0):

用于初始化OTL环境的静态函数,参数指定是用于多线程还是单线程。它不保证线程安全,也就是说,如果多个线程共享使用一个otl_connect对象,需要加锁进行控制。有个同事因为在多线程环境下使用了默认的参数0,就导致了程序异常。但是单线程环境下,参数设1是没有问题的。所以,可以考虑将此参数直接设为1。
void rlogon(...):

这个函数有多个版本,请注意参考官方文档中与相应数据库版本对应的函数声明。11g中用到的参数说明如下:
const char *connect_str:连接字符串,格式为:"用户名/密码@数据库服务名"
const int aauto_commit:自动提交模式。若此参数设为0(默认),则通过此连接对象执行的事务不会自动提交。如使用direct_exec执行删除记录的操作时,需要手动调用commit()成员函数提交事务;若设为1则通过此otl_connect对象开启的事务会自动提交。
long direct_exec(...):
const char *sqlstm: 指定所要执行的“静态SQL语句”,即不产生输入或输出的SQL语句。如delete from book where name='c++‘ 。但是不能执行如select sysdate from dual或select * from book亦或delete from book where name=:f1之类的语句,因为它们会带有输入或输出,此类SQL语句可以通过otl_stream实现,下面会有介绍。
int ignore_error:是否忽略异常。可以指定otl_exception::disable禁用异常,否则程序需要使用try...catch(otl_exception &e)...捕获并处理异常。
int connected:

此成员变量标识了连接对象是否连接成功,一旦连接成功其值即为1。即便后来网络断掉了,此值仍旧保持不变,logoff()后此值变为0。所以此变量只能用于检查rlogon是否连接成功,而不能判断当前与数据库的连接是否正常。

2. otl_stream类
void open(...):

为流对象关联一个SQL语句,可以是带输入或输出的SQL语句或PL/SQL块。
const int arr_size:指定流缓冲区的大小。作为输出流使用时,若输出缓冲区中的记录数达到此值即缓冲区满时,会自动刷新缓冲区,若已设设置了自动提交则一并提交数据(默认);
const char *sqlstm:SQL语句,可以指定绑定变量,如:delete from book where id = :f1 and price = :f2;
otl_connect &db:流所使用的数据库连接对象。
void set_commit(int auto_commit=0):

设置流被刷新时否自动提交事务。两种条件下流会被刷新:a.缓冲区满 b.手动调用flush成员函数
void flush(...):

执行和流关联的SQL语句。如执行:
otl_stream delStream;
delStream.open(100, delete from book where id = :f1 and price = :f2, dbConnect); //正常情况下向流中加入100条记录时才执行删除
delStream << 1;
delSteam << 'C++';
delStream.flush(); //立即执行删除操作,尽管当前流中只有一条记录
long get_rpc():

获取流中SQL语句执行后所影响到的记录数,如插入100条记录,则调用此函数返回的即为100
int good():

判断流对象是否已正常打开,已打开返回1。注意:若复用一个流对象时,必须先调用close函数将其关闭,然后再调用open重新打开。
int get_dirty_buf_len():

获取当前流对象缓冲区中的记录数,其最大值为缓冲区size-1。每当缓冲区满时会自动刷新,刷新后再调用此函数时返回0

3.otl_exception类
该类的几个成员用于表示异常的信息,如:
char stm_text[2048]:出错的SQL语句;
char var_info[256]:若在流中使用了与实际类型不符的绑定变量,此数组的值为绑定变量的信息;
unsigned char msg[1000]:这个我比较喜欢用,此数组显示出具体的异常信息(包括oracle返回的错误码),如连接超时等等。

三、对于网络异常的处理
现在项目对于程序的异常处理能力要求越来越高,比如网络中断或数据库出现异常等,要求在故障恢复后,程序能正常与数据库保持连接,使业务尽可能的少受影响。可以通过以下方法解决此种情况。这也是折磨了我两天的一个问题:(
首先,程序要在提交数据的地方使用try...catch捕获otl_exception异常,当提交失败时,otl会抛出此异常并携带异常信息;
其次,要在捕获到异常之后,关闭之前的连接对象(如果有流使用此连接对象,则一定要先关闭流对象,然后再断开otl_connect对象);
最后,重新连接数据库并再次初始化流对象。
如:

void ReConnect(otl_connect &otlConnect, const char *pConnStr, int iAutoCommit);

....
//声明otl对象并初始化对象
otl_connect dbConn;
otl_stream outStream;

void Init(void)
{
try
{
otl_connect::otl_initialize(1);
dbConn.rlogon("test1/password@testdb");
outStream.open(100, "insert into book values(:f1, :f2, :f3, :f4)", dbConn);
outStream.set_commit(1);
}
catch (otl_exception &e)
{
//处理异常
}
}

//提交数据的函数
void Submit(void)
{
try
{
for (int i = 0; i < 5000; i++)
{
outStream << i;
outStream << "abc";
outStream << i;
outStream << "null";
}
}
catch(otl_exception &e)
{
//提交数据异常,重新连接数据库并重新初始化流对象
outStream.close(); //必须先关闭流对象。若先断开连接会出现关闭流对象时报OCIHandleFree异常导致流对象无法正常关闭引起内存泄漏
ReConnect(dbConn, "test1/password@testdb", 0);
outStream.open(100, "insert into book values(:f1, :f2, :f3, :f4)", dbConn);
outStream.set_commit(1);
}
}

//重新连接连接数据库函数
void ReConnect(otl_connect &otlConnect, const char *pConnStr, int iAutoCommit)
{
if (1 == otlConnect.connected)
{
otlConnect.logoff();
}
Retry:
try
{
otlConnect.rlogon(pConnStr, iAutoCommit);
}
catch (otl_exception &e)
{
Sleep(1000);
goto Retry;
}
}
这样,调用Submit函数提交数据时,就有了网络异常处理功能,若提交失败则会一直尝试重新连接,直到连接成功为止。

函数原型: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 _*/))
参数说明:
mode——详细说明OCI初始化(Initialize)模式(mode)。它的取值如下:
OCI_DEFAULT——缺省模式;
OCI_THREADED——多线程模式;在该模式下,各并发处理中不为用户所见的内在数据结构受各自线程的保护,而不受别的线程干扰;
OCI_OBJECT——使用目标特性;
OCI_SHARED——使用共享内存;
OCI_EVENTS——
Mode参数可以拥有多个值,以“|”符号分隔各取值项。
*Ctxp——用户定义的内存回调程序;默认为0
*(*malocfp)——用户定义的内存分配程序;默认为0
*(*ralocfp)——重新分配内存程序;默认为0
*memptr 是指向内存块的指针;
*mfreefp——用户定义的内存释放程序;默认为0
该函数使用举例如下:
OCIInitialize((ub4) OCI_THREADED | OCI_OBJECT,
(dvoid *)0,(dvoid *(*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *,dvoid *,size_t))0,
(void (*)(dvoid *,dvoid *)) 0 )
注意!OCIEnvCreate() 可以代替OCIInitialize() 和OCIEnvInit() 在初始化OCI程序环境以后,使用OCIEnvInit来初始化OCI的环境句柄,该函数成功返回0。
函数原型:swordOCIEnvInit(OCIEnv **envhpp,
ub4 mode,
size_t xtramemsz,
dvoid **usrmempp )
参数说明:
**envhpp——指向环境句柄的指针;
mode——指定初始化环境句柄的模式,其取值如下:
OCI_DEFAULT——缺省模式;在缺省模式下,OCI库始终互斥各环境句柄;
OCI_NO_MUTEX——非互斥模式;在该模式下,OCI库各环境句柄并不互斥,所有的掉用都使用同一个环境句柄,并且只能有一个环境句柄起作用。
OCI_ENV_NO_UCB——禁止回滚模式;该模式用以禁止在环境句柄初始化过程中的动态CALL_BACK函数掉用;
Xtramemsz——指定在该环境句柄生存期内分配内存的数量;
**usrmempp——指向Xtramemsz参数的指针;usermempp参数是函数返回值;
该函数使用举例如下:
应用例子:OCIEnvInit((OCIEnv **) envhp,
(ub4) OCI_DEFAULT,
(size_t) 0,(dvoid **) 0) 一个OCI连接在建立前,还需要将所需要的句柄一一分配成功,在OCI8里,使用函数OCIHandleAlloc来分配各句柄,成功返回0。
函数原型:sword OCIHandleAlloc(CONST dvoid *parenth,
dvoid **hndlpp,
ub4 type,
size_t xtramem_sz,
dvoid **usrmempp )
参数说明:
*parenth——已初始化后的环境句柄;
**hndlpp——函数执行成功后,返回的一个OCI句柄;该返回值的具体含义由type参数来决定;
type——参数hndlpp的返回值的类型;其常用取值如下:
OCI_HTYPE_SVCCTX——返回一个服务类型的句柄;
OCI_HTYPE_ERROR——返回一个错误类型的句柄;
OCI_HTYPE_SESSION——返回一个会话类型的句柄;
OCI_HTYPE_SERVER——返回一个服务器类型的句柄;
OCI_HTYPE_STMT——返回一个陈述类型的句柄;
其中,陈述类型的句柄是在创建与数据库会话成功后,将要对数据库进行操作时分配的,其余类型的句柄是在环境句柄初始化后分配的;
xtramem_sz——指定在该句柄生存期内分配内存的数量;
**usrmempp——指向xtramem_sz参数的指针,由函数返回;
该函数使用举例如下:OCIHandleAlloc((dvoid *) *envhp,
(dvoid **) errhp,
(ub4) OCI_HTYPE_ERROR,
(size_t) 0,
(dvoid **) 0) (以给定的方式设置服务器连接指针的参数)。
分配各OCI句柄后,还需要做的工作是为OCI操作数据源创建存储路径,并将各项参数设置到相应的句柄中,这项工作由函数OCIServerAttach和OCIAttrSet来实现。成功,返回0。
函数原型:sword OCIServerAttach(OCIServer *srvhp,
OCIError *errhp,
CONST text *dblink,
sb4 dblink_len,
ub4 mode )
参数说明:
*srvhp——已分配成功的服务器句柄;
*dblink——登陆数据库的实例名;
dblink_len——参数*dblink字符串的长度;
mode——指定不同操作的模式。现在只有一种模式可选:OCI_DEFAULT。
该函数使用举例如下:OCIServerAttach(srvhp, errhp,
(text *) cstring,
(sb4) strlen((char *)cstring), (ub4) OCI_DEFAULT))
函数原型:sword OCIAttrSet (CONST dvoid *trgthndlp,
ub4 trghndltyp,
dvoid *attributep,
ub4 *sizep,
ub4 attrtype,
OCIError *errhp )
参数说明:
*trgthndlp——需要设置的句柄,该句柄在这之前已分配成功;该参数由trghndltyp参数决定;
trghndltyp——参数trgthndlp的类型,其取值参见OCIHandleAlloc函数说明中的type参数说明;
*attributep——设置参数trgthndlp的值;
*sizep——attributep参数指向的字符串长度;
attrtype——参数attributep的类型;其取值如下:
OCI_ATTR_SERVER——服务器类型;
OCI_ATTR_USERNAME——用户名类型
OCI_ATTR_PASSWORD——用户密码类型
OCI_ATTR_SESSION——会话类型;
该函数使用举例如下:OCIAttrSet((dvoid *) svchp,
(ub4) OCI_HTYPE_SVCCTX,
(dvoid *) srvhp,
(ub4) 0,
(ub4) OCI_ATTR_SERVER,
errhp))
(注:此时该函数的意思是将服务器句柄设置到服务句柄中,其类型为服务器类型)
说明:在登陆数据库前以给定的方式设置服务器连接指针的参数时,attrtype参数的所有类型都需要设置到服务句柄中。设置的步骤为:先将服务器句柄设置到服务句柄中,然后将用户名、密码设置到会话句柄中,在调用OCISessionBegin函数成功后,再将会话句柄设置到服务句柄中。 创建和开始与数据库的会话使用函数OCISessionBegin来实现,其目的是建立与数据库的会话连接;函数成功,返回0。
函数原型:sword OCISessionBegin (OCISvcCtx *svchp,
OCIError *errhp,
OCISession *authp,
ub4 credt,
ub4 mode))
参数说明:
*svchp——已分配并设置成功的服务句柄;
*authp——已分配并设置了用户名、密码的会话句柄;
credt——建立用户会话的类型;其取值如下:
OCI_CRED_RDBMS——需要使用用户名和密码来建立会话;
OCI_CRED_EXT——不需要使用用户名和密码来建立会话;
mode——操作的模式;其取值如下:
OCI_DEFAULT——缺省模式;在该模式下只支持一个会话句柄;
OCI_MIGRATE——移动会话模式;在该模式下,新的会话连接会以不同的会话句柄返回;使用该模式创建新的会话时,必须已存在一个不可移动会话模式的会话连接。也就是说,一个移动会话模式的会话连接必须有一个不可移动模式的连接作为父连接;
OCI_SYSDBA——在该模式下,会鉴别用户是否以SYSDBA形式对数据库进行访问;
OCI_SYSOPER——在该模式下,会鉴别用户是否以SYSOPER形式对数据库进行访问;
OCI_PRELIM_AUTH——这种模式和OCI_SYSDBA、OCI_SYSOPER一起使用,作为某些访问任务的鉴别;
该函数使用举例如下:OCISessionBegin(svchp,
errhp,
authp,
OCI_CRED_RDBMS,
OCI_DEFAULT) 若某函数执行出错,则可以使用函数OCIErrorGet来取得错误原因,从而能得到某些提示。
函数原型:sword OCIErrorGet (dvoid *hndlp,
ub4 recordno,
text *sqlstate,
sb4 *errcodep,
text *bufp,
ub4 bufsiz,
ub4 type )
参数说明:
*hndlp——错误类型句柄errhp;
recordno——错误查找的原始位置,从1开始,其缺省值为1;
*sqlstate——OCI8不支持,缺省值为NULL;
*errcodep——ORACLE错误返回代码,由函数返回;初始值可以为(sb4)0;
*bufp——错误信息提示,由函数以字符串形式返回;
bufsiz——bufp参数原始字符串长度;
type——句柄类型;其取值为OCI_HTYPE_ERR或着为OCI_HTYPE_ENV;缺省值为OCI_HTYPE_ERR;
该函数使用举例如下:OCIErrorGet((dvoid *) errhp,
(ub4) 1,
(text *) NULL,
&errcode,
(text *)msgbuf,
(ub4) sizeof(msgbuf),
(ub4) OCI_HTYPE_ERROR) 用户定义的SQL或PL/SQL陈述语句。
在执行SQL或PL/SQL语句前,需要对该语句执行分析、出错检查,并和陈述句柄绑定起来,使用函数OCIStmtPrepare来进行这一系列操作。该函数在执行陈述语句前必须使用;成功,返回0;
函数原型:sword OCIStmtPrepare ( OCIStmt *stmtp,
OCIError *errhp,
CONST text *stmt,
ub4 stmt_len,
ub4 language,
ub4 mode)
参数说明:
*stmtp——已分配成功的陈述句柄;
*stmt——用户定义的需要执行的SQL或PL/SQL陈述语句;
stmt_len——用户定义的需要执行的陈述语句的长度;该参数的值不能为0;
language——语法模式;声明是本地语法,还是V7模式语法。其取值如下:
OCI_V7_SYNTAX——ORACLE的V7分析语法;
OCI_NTV_SYNTAX——语法依赖于服务器的版本;
mode——模式;其缺省值为OCI_DEFAULT;
该函数使用举例如下:OCIStmtPrepare(stmthp,
errhp,
sqlcommand,
(ub4)strlen((char *)sqlcommand),
(ub4) OCI_NTV_SYNTAX,
(ub4) OCI_DEFAULT) OCI执行陈述语句后,将所选择的变量值返回输出,此时需有用户定义的地址空间来容纳这些返回值。使用函数OCIDefineByPos通过在陈述语句中标志某变量在用户定义的变量集合中的位置来定义变量;若该函数执行成功,返回0。
函数原型:sword OCIDefineByPos (OCIStmt *stmtp,
OCIDefine **defnpp,
OCIError *errhp,
ub4 position,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *rlenp,
ub2 *rcodep,
ub4 mode )
参数说明:
**defnpp——用户定义的变量集合的指针;该参数指针从下标0开始,依次递增一个数组单元;
position——需要定义的变量在定义句柄的列表中的位置,从1开始;例如:
SELECT empno, ssn, mgrno FROM employees;
则empno的position值为1,ssn的position的值为2,mgrno的position值为3;以此类推。
*valuep——需要定义的变量的在执行成功后的存储地址;如果提取出来的数据有多项,则该参数可以使用数组;
value_sz——valuep参数的指向的存储地址空间的长度;
dty——需要定义的变量的数据类型;SQLT_STR表示该变量是个字符串变量;SQLT_INT则表示该变量是个整型变量;
*indp——变量或数组指示器,默认为0;
*rlenp——变量或数组长度指示器,默认为0;
*rcodep——即将提取的变量的值指示器,默认为0;
mode——变量提取模式。其取值为OCI_DEFAULT或OCI_DYNAMIC_FETCH;OCI_DYNAMIC_FETCH用于在提取资料过程中,需要动态资料的时候,此时必须用CIDefineDynamic函数建立一个回调函数用以提取数据;这种情况下,valuep和value_sz参数可以忽略;
该函数使用举例如下:OCIDefineByPos(stmthp, &dfnhp[4],
errhp, (ub4) 5,
(dvoid *) &No[0],
(sb4) sizeof(No[0]),
(ub2) SQLT_INT,
(dvoid *) 0,
(ub2 *) 0,
(ub2 *) 0,
(ub4) OCI_DEFAULT)
补充说明:如果输出变量是多行资料,其大小为输出变量的行数与该变量自身大小的乘积。此时,在函数后面还需要使用另一个函数OCIDefineArrayOfStruct来定义该数组。函数OCIDefineArrayOfStruct说明如下:
函数原形:sword OCIDefineArrayOfStruct(OCIDefine *defnp,
OCIError *errhp,
ub4 pvskip,
ub4 indskip,
ub4 rlskip,
ub4 rcskip )
参数说明:
*defnp——从函数OCIDefineByPos返回的对应该变量的定义句柄,对应于OCIDefineByPos函数的第二项参数defnpp;
indskip——默认为0;
rlskip——默认为0;
rcskip——默认为0;
该函数使用举例说明如下(对应于函数OCIDefineByPos的例子):
OCIDefineArrayOfStruct(dfnhp[4],
errhp,
sizeof(No[0]),
0,0,0) OCI在执行陈述语句时,有时需要向该语句传递输入值,OCI8通过函数OCIBindByPos或OCIBindByName来实现该功能,OCIBindByPos将需要输入的变量与与其对应的参数值的位置绑定起来,从而实现向陈述语句中传递值的效果,而OCIBindByName则是通过绑定相应的变量名称来实现输入值的传递。
函数原型:sword OCIBindByPos ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
ub4 position,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode )
参数说明:
position——需要绑定的该变量在陈述语句的列表中的位置,从1开始,依次递增;
*valuep——需要绑定的传入值的存储地址;
value_sz——valuep参数的指向的存储地址空间的长度;
dty——需要绑定的变量的数据类型;SQLT_STR表示该变量是个字符串变量;SQLT_INT则表示该变量是个整型变量;
*indp——变量或数组指示器,默认为0;
*alenp——变量或数组长度指示器,默认为0;
*rcodep——即将提取的变量的值指示器,默认为0;
maxarr_len——dyt参数的最大可能取值的数目,在非PL/SQL语句中该差数无效果;默认值为0;
*curelep——对应与maxarr_len,表示dyt参数取值的实际数目;默认值为0;
mode——变量提取模式。其取值为OCI_DEFAULT或OCI_DATA_AT_EXEC;当使用OCI_DATA_AT_EXEC时,value_sz表示在该陈述语句执行过程中可以使用的传入的该项值的最大存储长度,此时需要动态绑定该传入值;一般来说,mode的取值都为OCI_DEFAULT;
该函数使用举例如下:OCIBindByPos(stmthp, &bndhp[3],
errhp, (ub4) 4,
(dvoid *) register_number,
(sb4) nLen, SQLT_STR,
(dvoid *) 0, (ub2 *)0,
(ub2 *)0,
(ub4) 0, (ub4 *) 0,
(ub4) OCI_DEFAULT)
函数原型:sword OCIBindByName ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
CONST text *placeholder,
sb4 placeh_len,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode )
参数说明:
*stmtp——用以进行查询的陈述语句句柄;该句柄必须是已经分配成功的句柄;
**bindpp——用户定义的传入值集合的指针;该参数指针从下标0开始,依次递增一个数组单元;
*placeholder——需要绑定的该变量在陈述语句中的占位符;
placeh_len——palceholder参数的长度;
*valuep——指向需要绑定的该变量的传入值的地址;
value_sz——valuep参数存储的变量值的位组长度;
dty——需要绑定的变量的数据类型;SQLT_STR表示该变量是个字符串变量;SQLT_INT则表示该变量是个整型变量;
*indp——变量或数组指示器,默认为0;
*alenp——变量或数组长度指示器,默认为0;
*rcodep——即将提取的变量的值指示器,默认为0;
maxarr_len——dyt参数的最大可能取值的数目,在非PL/SQL语句中该差数无效果;默认值为0;
*curelep——对应与maxarr_len,表示dyt参数取值的实际数目;默认值为0;
mode——变量提取模式。其取值为OCI_DEFAULT或OCI_DATA_AT_EXEC;当使用OCI_DATA_AT_EXEC时,value_sz表示在该陈述语句执行过程中可以使用的传入的该项值的最大存储长度,此时需要动态绑定该传入值;一般来说,mode的取值都为OCI_DEFAULT;
该函数使用举例如下:OCIBindByName(stmthp, &bndhp[1], errhp,
(text *) :field1,
(sb4) strlen((char *) :phone_number),
(dvoid *) & to_field1,
(sb4) sizeof(phone_number),
SQLT_STR,
(dvoid *) 0, (ub2 *)0,
(ub2 *)0,(ub4) 0, (ub4 *) 0,
(ub4) OCI_DEFAULT)
补充说明:如果输入变量是多行资料,则valuep参数应该为一个用户定义了大小的静态数组的初始地址,其大小为输入变量的行数与该变量自身大小的乘积。此时,在函数后面还需要使用另一个函数OCIBindArrayOfStruct来定义该数组。函数OCIBindArrayOfStruct说明如下:
函数原型:sword OCIBindArrayOfStruct ( OCIBind *bindp,
OCIError *errhp,
ub4 pvskip,
ub4 indskip,
ub4 alskip,
ub4 rcskip )
参数说明:
*bindp——从函数OCIBindByPos或OCIBindByName返回的对应该变量的绑定句柄,对应于函数OCIBindByPos或OCIBindByName的第二项参数bindpp;
pvskip——从本条记录中该变量的存储地址的到下条记录中该变量的存储地址之间的大小;也就是定义的一条记录的存储空间的大小;
indskip——默认为0;
rlskip——默认为0;
rcskip——默认为0;
该函数使用举例如下:OCIBindArrayOfStruct(bndhp[N],
errhp,
sizeof(record_array[0]),
indsk[N],
rlsk[N],
rcsk[N]) 在执行语句分析完成,并且变量定义或绑定完成后,便可以执行该陈述句柄,从而实现陈述语句中的SQL语句能完成的功能。使用函数OCIStmtExecute来执行该陈述句柄。执行成功,返回0;
函数原型:sword OCIStmtExecute ( OCISvcCtx *svchp,
OCIStmt *stmtp,
OCIError *errhp,
ub4 iters,
ub4 rowoff,
CONST OCISnapshot *snap_in,
OCISnapshot *snap_out,
ub4 mode)
参数说明:
*svchp——已分配并设置成功的服务句柄;
*stmtp——指向需要执行的陈述语句的句柄;
iters——对于非选择语句来说,该函数执行次数等于iters减去rowoff的值;对于选择语句来说,如果iters不为0,则该函数在执行前必须有定义句柄(即需要定义位址空间来存储select出来的变量值),而函数会预先提取出多于iters条记录(如果可提取记录条数大于iters的话),将其中iters条正式提取出来;如果事先并不知道有多少条记录会被提取,则将iters的值置为0;在非选择语句中,若iters的值为0,则函数返回错误;
rowoff——函数执行时,输入变量在绑定的变量数组的开始位置。用于多行记录的修改或插入、删除;比如,定义的绑定变量为array[100],执行该函数时,iters的值为50,rowoff的值为10,则表示从array[10]开始提取传入值,而执行的次数则是50-10 = 40(次);
*snap_in——可选参数。默认值为0;
*snap_out——可选参数。默认值为0;
mode——执行模式;有四种执行模式:
OCI_DEFAULT——缺省模式,在该模式下,总是隐式返回选择选择语句的有关描述信息;
OCI_DESCRIBE_ONLY——在该模式下,陈述句柄并不被执行,但是它会返回可提取记录的条数;
OCI_COMMIT_ON_SUCCESS——在该模式下,如若函数执行成功,则当前的处理马上会自动提交;
OCI_EXACT_FETCH——该模式用于当前程序很明确的清楚有多少条记录会被提取出来;并且,使用该模式前必须要有定义句柄;
该函数的使用举例如下:OCIStmtExecute(svchp, stmthp, errhp,
(ub4) nCount, (ub4) 0,
(CONST OCISnapshot*) 0,
(OCISnapshot*) 0,
(ub4) OCI_DEFAULT)
另外,还可以使用函数OCIStmtFetch来提取固定数目的记录,其函数使用说明如下:
函数原型:sword OCIStmtFetch ( OCIStmt *stmtp,
OCIError *errhp,
ub4 nrows,
ub2 orientation,
ub4 mode )
参数说明:
*stmtp——需要执行的陈述句柄;
nrows——需要提取的记录的条数;
orientation——该参数只有唯一一个缺省值:OCI_FETCH_NEXT;
mode——默认为OCI_DEFAULT;
该函数使用举例如下:sword OCIStmtFetch (stmtp,
errhp,
rows_number,
OCI_FETCH_NEXT,
OCI_DEFAULT)
该函数成功执行,而无数据时,返回OCI_NO_DATA; 在执行陈述句柄后,有的语句如insert、delete等需要提交当前事务,从而真正实现insert、delete等功能。OCI8使用函数OCITransCommit来实现这一功能。
函数原型:sword OCITransCommit ( OCISvcCtx *svchp,
OCIError *errhp,
ub4 flags )
参数说明:
*svchp——已分配并设置成功的服务句柄;
flags——提交标志。默认为0;
该函数使用举例如下:OCITransCommit(svchp, errhp, (ub4) 0) 在执行完陈述语句后,若需要取消当前执行的操作,则需要回滚当前事务。OCI8使用函数OCITransRollback来完成该功能。
函数原型:sword OCITransRollback(dvoid *svchp,
OCIError *errhp,
ub4 flags )
参数说明:
*svchp——需要回滚当前事务的服务句柄;
flags——回滚标志。只有一个唯一的取值得:OCI_DEFAULT;
该函数使用举例如下:OCITransRollback(svchp,
errhp,
OCI_DEFAULT) 断开与数据库的连接需要进行下面一系列工作:结束当前会话、断开与数据库连接服务、释放分配的各个句柄。下面分别说明各项工作所使用的oci函数。
结束当前会话:如果要断开与数据库的连接,则需要先结束当前会话,使用函数OCISessionEnd来完成该功能。执行成功,返回0
函数原型:sword OCISessionEnd(OCISvcCtx *svchp,
OCIError *errhp,
OCISession *authp,
ub4 mode)
参数说明:
*svchp——需要断开的服务句柄;
*authp——会话句柄;
mode——会话结束模式。只有一种模式:OCI_DEFAULT;
该函数使用举例如下:OCISessionEnd(svchp,
errhp,
authp,
(ub4) 0)
断开与数据库的连接服务:当前会话结束后,需要断开与服务器的连接,结束用户对数据库的操作。OCI8使用函数OCIServerDetach来完成该任务。执行成功,返回0;
函数原型:sword OCIServerDetach(OCIServer *srvhp,
OCIError *errhp,
ub4 mode )
参数说明:
*svchp——需要断开的服务器句柄;
mode——执行模式,只有一种模式:OCI_DEFAULT;
该函数使用举例如下:OCIServerDetach(srvhp,
errhp,
(ub4) OCI_DEFAULT)
释放分配的各个句柄:在结束当前会话、断开与数据库的连接后,由于我们手动分配了很多句柄,系统不会自动释放,因而需要手工释放这些句柄,清扫使用环境。OCI8里,使用函数OCIHandleFree来释放各个句柄。
函数原型:sword OCIHandleFree(dvoid *hndlp,ub4 type)
参数说明:
*hndlp——需要释放的句柄;
type——该句柄的类型。参见OCIHandleAlloc函数说明的type参数;
注:使用OCIHandleAlloc函数分配了哪些句柄,那么就需要用该函数释一一放这些句柄;
创建 dblink
create public database link TO_ORCL
connect to to_orcl identified by to_orcl
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)))(CONNECT_DATA =(sid = orcl)))';




MATLAB的nlpredci函数怎么看结果?
nlpredci()——非线性模型置信区间预测 [ypred,delta] = nlpredci(FUN,inputs,beta,resids,J)ypred——预测值 delta——非线性最小二乘法估计的置信区间长度的一半,当resids长度超过beta的长度并且J的列满秩时,置信区间的计算是有效的。[ypred-delta,ypred+delta]——置信度为95%的置信区间...

讨论函数y=Iax2+bx+cI的图像与y=m的交点个数,请大家帮帮忙,详细点,应 ...
您好楼主,为您解答。首先我们可以估计他们交点的个数。 交点个数:0个,1个,2个,3个,4个,无数个。以上都是有可能的。以下为分析。我们用分类的方法,y=ax^2+bx+c, 是二次函数。所以图形应该是抛物线~。在delta大于零(和x轴两个交点),小于零(和x轴无交点),等于零(和x轴一个交点...

不定积分∫[ cosx\/ x] dx的算法是怎样的?
cosx\/x这个原函数不是初等的,所以高数程度不用知道算法,这个积分可用特殊函数余弦积分Ci(x)来表示,某些非初等函数的积分能用这样的特殊函数表示。具体回答如图:不定积分的意义:如果f(x)在区间I上有原函数,即有一个函数F(x)使对任意x∈I,都有F'(x)=f(x),那么对任何常数显然也有[F(x)+...

hr,0.76;95%ci,0.65-0.89;p<0.001 统计学中这是什么意思
hr,0.76;95%ci,0.65-0.89;p<0.001是指风险率为0.76,小于1,为保护性因素,其95%可信区间为0.65-0.89,p小于0.001,说明有显著性统计学意义。1、HR是指风险率、危害比(hazard  ratio, HR)[HR=暴露组的风险函数h1(t)\/非暴露组的风险函数h2(t),t指在相同...

数学建模常用到的matlab函数有哪些?
tcdf 学生氏t分布的累加函数unidcdf 离散均匀分布的累加函数unifcdf 连续均匀分布的累加函数weibcdf 威布尔分布的累加函数表Ⅰ-3 累加分布函数的逆函数函数名 对应分布的累加分布函数逆函数betainv 贝塔分布的累加分布函数逆函数binoinv 二项分布的累加分布函数逆函数chi2inv 卡方分布的累加分布函数逆函数expinv 指数...

C语言用函数求字符串中最长单词.
include<stdio.h> include<string.h> int main(){ char str[100];gets(str);void findLongest(char str[]);findLongest(str);return 0;} void findLongest(char str[]){ int currLen=0,maxLen=0,currStart=0,MaxStart=0;int i=0,j=0;for(i=0;str[i];i++){ if((str[i]>='a...

量子高手进,什么是本征态
算符A作用于函数f(r)上,得出另一个函数F(r)。若算符A作用于一些特定的函数序列Ui(r)上(i=1,2,?)的结果都等于一常量乘同一函数,即Ci*F(r)的形式(i=1,2,3,4...)。则称常数Ci为算符A的本征值,Fi(r)(原函数)称为属于这个本征值的本征函数。上式称为算符A的本征值方程。

如何用sql语句创建函数如何用sql语句创建函数数据
sql创建函数 -测试环境mssql2008 -Idea,用逗号将字符串拆分,然后转换成行和列。-最好使用CLR -1.建造一张桌子 创建表T (pkqvarchar(200))-2.插入数据 插入到T值(井4,井0,井0,井0,井0,井0,,,)插入到T值(匡,井0,休,井0,井0,井0,井0,井8,井4,井0,井0,井0,...

COUNT()函数的作用是什么?
假设B1为文字“100”,B2为数字“3”,则COUNT(B1:B2)等于1。COUNT是计算包含数字的单位元格的个数,B1:B2,即B1单位元格和B2单位元格,结果等于2。如果10是“十”或文本格式,则结果为1。COUNT函数只能对数字数据进行统计,对于空单元格、逻辑值或者文本数据将被忽略,因此可以利用该函数来判断给定...

求反三角函数的原函数?
- (1\/2) ∫ [1\/(1+x^2)] d(1+x^2) = x arctanx - (1\/2)ln(1+x^2) +C 它是反正弦arcsin x,反余弦arccos x,反正切arctan x,反余切arccot x,反正割arcsec x,反余割arccsc x这些函数的统称,各自表示其反正弦、反余弦、反正切、反余切 ,反正割,反余割为x的角。

安仁县13882175901: OCI常用函数的大致步骤 -
封翠美克: 一、 定义并初始化所需各变量 envhp、srvhp、errhp、svchp、authp、hndlp、stmthp、等等 二、连接数据库1、 OCIInitialize.初始化OCI程序环境2、OCIEnvInit. 初始化OCI环境句柄3、 OCIHandleAlloc.分配各句柄,需要分配的句柄类型如下...

安仁县13882175901: 列举数据库几个开幕函数 -
封翠美克: Oracle 8 数据库函数库的列举与具体介绍 OCIDefineByName: 让 SELECT 指令可使用 PHP 变量.OCIBindByName: 让动态 SQL 可使用 PHP 变量.OCILogon: 打开与 Oracle 的链接.OCILogOff: 关闭与 Oracle 的链接.OCIExecute:...

安仁县13882175901: OCI是什么? -
封翠美克: OCI(Oracle Call Interface)是ORACLE公司开发的一个应用程序开发工具,是一个通过访问Oracle数据库的服务器,控制各类SQL语句的执行,进而创建应用程序的的应用程序接口(API).它支持SQL所有的数据定义,数据操作,查询,事务管理等操作,支持C和C++的数据类型,调用,语法和语义.它提供了一组可对Oracle数据库进行存取的接口子例程(函数). OCI程序实质上就是用高级语言写的程序,其特点是内部含有对OCI子函数库的调用,通过在第三代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的. 可用oracle打开OCI文件!

安仁县13882175901: 下面这些OCI函数到底是在哪个lib库中实现的?用的是ORACLE11g -
封翠美克: 一、开始前的准备工作 在使用OTL进行编程之前,要首先确定使用的Oralce版本以及所选用的字符集.OTL支持目前几乎所有的主流数据库,可以通过宏启用otlv4.h中对应的数据库操作接口.如:使用Oracle 11g R2、字符集选择UTF8,则可在...

安仁县13882175901: php操作orcal时用的oci - parse函数是什么作用,对应mysql里的哪个函数 -
封翠美克: 预处理,mysql里没有对应的.不太一样.返回一个标识符,用于以后需要操作的,比如: oci_bind_by_name()和oci_execute() .这俩函数都得用这个返回标识符.

安仁县13882175901: C语言中的标准函数有哪些 -
封翠美克: C语言输入输出函数有很多,标准I/O函数中包含了如下几个常用的函数: scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等. int getc(FILE *fp) getc主要是从文件中读出一个字符.常用的判断文件是否读取结束的语...

安仁县13882175901: c++程序有哪几种常用的函数 -
封翠美克: 字符串函数 STRCAT STRCMP 程序控制函数 FOR WHILE SWITCH 赋值函数 SPRINTF 内存函数 MALLOC NEW

安仁县13882175901: OCIDirPathColArrayToStream()这个函数返回OCI - CONTINUE,这种情况该怎么处理 -
封翠美克: 可能原因是插入数据过快,导致回调失败.OCI_CONTINUE This code is returned only from a callback function. It indicates that the ca...

安仁县13882175901: 大O符号的常用的函数阶 -
封翠美克: 下面是在分析算法的时候常见的函数分类列表.所有这些函数都处于 n 趋近于无穷大的情况下,增长得慢的函数列在上面. c 是一个任意常数. 符号 名称 O(1) 常数(阶,下同) O(log*n) 迭代对数 O(log n) 对数 O[(log n)^c] 多对数 O(n) 线性,次线性 O(n log n) 线性对数,或对数线性、拟线性、超线性 O(n^2) 平方 O(n^c),Integer(c>1) 多项式,有时叫作“代数”(阶) O(c^n) 指数,有时叫作“几何”(阶) O(n!) 阶乘,有时叫做“组合”(阶)

安仁县13882175901: 常用的excel函数公式有哪些? -
封翠美克: 求和=SUM(数字,数字) 、求平均值=AVERAGE(number1,number2,……)、求最大值=MAX(number1,number2……)、求最小值=MIN(number1,number2……)、求排名=RANK(Number,ref,order)、IF多条件判断返回值公式:C2=IF(AND(A2<500,B2...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网