科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Oracle常用的OCI函数(三)

Oracle常用的OCI函数(三)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

ub4 credt, //认证类型 ub4 mode //操作模式 ); *认证类型: OCI_CRED_RDBMS:用数据库

作者:builder.com.cn 2007年9月16日

关键字: 甲骨文 体系结构 数据库 ORACLE

  • 评论
  • 分享微博
  • 分享邮件

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);

 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件