服务器 频道

Oracle常用的OCI函数之二

  【IT168 服务器学院】三. OCI函数说明

  示例以下面结构作为说明
   sword     swResult;
  OCIBind*  hBind;
  OCIDefine*  hDefine;
  OCIStmt      *stmtp
  OCIError     *errhp;
  OCIStmt       *stmtp
  OCISvcCtx  * svchp
  OCIEnv * envhpp;
  OCISession * usrhp;
  sb2 sb2aInd[30]; //指示器变量,用于取可能存在空值的字段
  Typedef strcut
  {
  char tname[40];
  int age;
  } t_std;
  typedef struct
  {
  sb2     sb2_tname[100];
   sb2     sb2_age[100];
  } stdInd_T;  //指示器数组
  typedef struct
  {
  ub2     ub2_tname[100];
   ub2     ub2_age[100];
  } stdLen_T; //字段长度

  t_std tstd[100];  //数组变量,用于批量操作
  stdInd_T tstdInd;
  stdLen_T tstdLen;
  stdLen_T tstdRet;

  t_std std;

  各函数数明

  1.创建OCI环境


  sword OCIEnvCreate(  
  OCIEnv **envhpp,  //OCI环境句柄指针
  ub4 mode, //初始化模式:OCI_DEFAULT/OCI_THREADED 等
  CONST dvoid *ctxp,
  CONST dvoid *(*malicfp)(dvoid *ctxp,size_t size),
  CONST dvoid *(ralocfp)(dvoid *ctxp,dvoid *memptr,size_t newsize),
  CONST void *(*mfreefp)(dvoid *ctxp,dvoid *memptr),
  Size_t xstramemsz,
  Dvoid **usrmempp
  )
  eg :
  swResult = OCIEnvCreate(&envhpp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);

  if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)
  return FALSE;

  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 _*/)
  );

  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   //错误句柄
  )

0
相关文章