服务器 频道

Oracle常用的OCI函数之四

  9.执行SQL语句

  sword OCIStmtExecute (
  OCISvcCtx           *svchp,  //服务环境句柄
                        OCIStmt             *stmtp,  //语句句柄
                        OCIError            *errhp,
                        ub4                 iters, // **
                        ub4                 rowoff, //**
                        CONST OCISnapshot   *snap_in,
                        OCISnapshot         *snap_out,
                        ub4                 mode //**
  );
  **注:
  1. iters:对于select语句,它说明一次执行读取到buffer中的记录行数,如果不能确定select语句所返回的行数,可将iters设置为0,而对于其他的语句,iters表示这些语句的执行次数,此时iters不能为0。
  2. rowoff:在多行执行时,该参数表示从所结合的数据变量中的第几条记录开始执行(即记录偏移量)。
  3. mode:=OCI_DEFAULT:default模式
  =OCI_DESCRIBE_ONLY:描述模式,只返回选择列表的描述信息,而不执行语句
  =OCI_COMMIT_ON_SUCCESS:自动提交模式,当执行成功后,自动提交。
  =OCI_EXACT_FETCH:精确提取模式。
  =OCI_BATCH_ERRORS:批错误执行模式:用于执行数组方式的操作,在此模式下,批量insert ,update,delete时,执行过程中任何一条记录错误不会导致整个insert ,update,delete失败,系统自动会收集错误信息,而在非批错误方式下,其中的任何一条记录错误,将会导致整个操作失败。
  Eg:
  执行一次
  swResult = OCIStmtExecute(svchp, stmtp,  errhp;,
                       1, 0, NULL, NULL, OCI_DEFAULT);
  批量执行100次:
  swResult = OCIStmtExecute(svchp, stmtp,  errhp;,
                       100, 0, NULL, NULL, OCI_DEFAULT);

  10.定义输出变量
   
  OCIDefineArrayOfStruct()   Set additional attributes for static array define  
  OCIDefineByPos()   Define an output variable association  
  OCIDefineDynamic()   Sets additional attributes for define in OCI_DYNAMIC_FETCH mode  
  OCIDefineObject()   Set additional attributes for define of named data type  

  sword OCIDefineByPos (
  OCIStmt     *stmtp, //语句句柄
                        OCIDefine   **defnpp,//定义句柄—用于数组变量
                        OCIError    *errhp,
                        ub4         position,//位置序号(从1 开始)
                        dvoid       *valuep, //输出的变量名
                        sb4         value_sz, //变量长度
                        ub2         dty,  //数据类型
                        dvoid       *indp, //指示器变量/指示器变量数组,如果此字段可能存在空值,则要指示器变量,否则单条处理时为NULL
                        ub2         *rlenp, //提取的数据长度
                        ub2         *rcodep, //列级返回码数组指针
  ub4         mode //OCI_DEFAULT
  );

  
  sword OCIDefineArrayOfStruct (
  OCIDefine   *defnp,//由OCIDefineByPos定义的句柄
                  OCIError    *errhp,
  ub4         pvskip, //下一列跳过的字节数,一般就是结构的大小
                  ub4         indskip,//下一个指示器或结构跳过的字节数,=0
                  ub4         rlskip, //下一个实际值跳过的字节数,=0
                  ub4         rcskip //下一个列列级返回值跳过的字节数,=0
  );

  sword OCIDefineDynamic (
  OCIDefine   *defnp,
                          OCIError    *errhp,
                          dvoid       *octxp,
                          OCICallbackDefine       (ocbfp)(/*_
                                   dvoid          *octxp,
                                   OCIDefine      *defnp,
                                   ub4            iter,
                                   dvoid          **bufpp,
                                   ub4            **alenpp,
                                   ub1            *piecep,
                                   dvoid          **indpp,
                                   ub2            **rcodep _*/)  );

  sword OCIDefineObject ( OCIDefine       *defnp,
                         OCIError        *errhp,
                         CONST OCIType   *type,
                         dvoid           **pgvpp,
                         ub4             *pvszsp,
                         dvoid           **indpp,
                         ub4             *indszp );

  eg:

  单条查询
  sql: select username,age from student  where username=:p1;
  如果此字段有可能有空值,则
  hDefine = NULL;
  swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tstd.username), SQLT_CHR, & sb2aInd[0], NULL, NULL, OCI_DEFAULT);
  如果此字段没有空值,则
  hDefine = NULL;
  swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tstd.username), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT);

   批量查询
  select username,age from student  where age>30;
  hDefine = NULL;
  swResult = OCIDefineByPos(stmtp, &hDefine, errhp, 1, &tstd[0].username,
  sizeof(tstd[0].usenmae), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT);

  swResult = OCIDefineArrayOfStruct(hDefine, errhp, sizeof(tstd[0]), 0, 0, 0);

0
相关文章