Home  >  Article  >  Database  >  Oracle常用的OCI函数

Oracle常用的OCI函数

WBOY
WBOYOriginal
2016-06-07 15:01:371811browse

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 sword OCIEnvInit ( OCIEnv **envhpp, ub4 mode, size_t xtramemsz, dvoid **usrmempp ); 注: 在8i以后,可用OCIEnvCreate一个函数就可以初始化环境了,相当于OCIInitialize+ OCIEnvInit 2.申请/

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

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  //申请到的内存块指针
)
注:
 一般需要申请的句柄有:
              服务器句柄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)
{

return FALSE;
}
 
释放句柄
 sword OCIHandleFree(
dvoid *hndlp,  //要释放的句柄
ub4 type   //句柄类型
)

eg:
OCIHandleFree(stmtp, OCI_HTYPE_STMT)
3.读取/设置句柄属性
 sword OCIAttrSet(
dvoid *trgthndlp,  //需设置的句柄名
ub4  trghndltyp, //句柄类型
dvoid *attributep, //设置的属性名
ub4 size, //属性值长度
ub4 attrtype,     //属性类型
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:设置用户名和密码
char username[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)
return FALSE;

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

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

4.连接/断开服务器
  多用户方式连接:
sword  OCIServerAttach(
OCIServer     *srvhp,//未初始化的服务器句柄
                    OCIError      *errhp,
                      CONST text    *dblink,//服务器SID
                        sb4           dblink_len,
                       ub4           mode //=OCI_DEFAULT,系统环境将设为阻塞方式
);

  sword OCIServerDetach (
OCIServer   *srvhp,
                OCIError    *errhp,
                        ub4         mode //OCI_DEFAULT
);
单用户方式连接:
  sword OCILogon (
OCIEnv          *envhp,
                  OCIError        *errhp,
                OCISvcCtx       **svchp,
                CONST text      *username,
                ub4             uname_len,
                CONST text      *password,
                ub4             passwd_len,
                CONST text      *dbname,
                ub4             dbname_len
);

sword OCILogoff (
OCISvcCtx      *svchp
                OCIError       *errhp
);

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

         *认证类型:
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)
return FALSE;


sword OCISessionEnd (
OCISvcCtx       *svchp,
                      OCIError        *errhp,
                      OCISession      *usrhp,
                    ub4             mode );
6.读取错误信息
  sword OCIErrorGet (
dvoid      *hndlp, //错误句柄
                    ub4        recordno,//从那里读取错误记录,从1开始
                    text       *sqlstate,//已取消,=NULL
                    sb4        *errcodep, //错误号
                    text       *bufp,  //错误内容
                    ub4        bufsiz,  //bufp长度
                    ub4        type //传递的错误句柄类型
=OCI_HTYPE_ERROR:错误句柄
=OCI_HTYPE_ENV:环境句柄
);
eg:
ub4    ub4RecordNo = 1;
OCIError* hError
sb4    sb4ErrorCode;
char   sErrorMsg[1024];

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

 

  [1] [2] [3] [4] [5] 

Oracle常用的OCI函数

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn