科技行者

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

知识库

知识库 安全导航

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

Oracle常用的OCI函数(四)

  • 扫一扫
    分享文章到微信

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

7.准备SQL语句 sword OCIStmtPrepare ( OCIStmt *stmtp,//语句句柄 OCIError *errhp, CO

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

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

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


7.准备SQL语句
sword OCIStmtPrepare (
OCIStmt       *stmtp,//语句句柄  
                OCIError      *errhp,
                      CONST text    *stmt,  //SQL语句
                      ub4           stmt_len,   //语句长度
                      ub4           language,  //语句的语法格式=OCI_NTV_SYNTAX
ub4           mode //=OCI_DEFAULT
);

eg:
char sSQL[1024];

sprintf(sSQL, “select table_name from user_tables”);

swResult = OCIStmtPrepare(stmtp errhp,  (CONST OraText*)sSQL, strlen(sSQL), OCI_NTV_SYNTAX, OCI_DEFAULT);
if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)
return FALSE;

 


8. 绑定输入参数

OCIBindArrayOfStruct() Set skip parameters for static array bind ,数组绑定,一般用于批量操作
OCIBindByName() Bind by name  按名绑定
OCIBindByPos() Bind by position  按位置绑定,建议一般按此方式绑定
OCIBindDynamic() Sets additional attributes after bind with OCI_DATA_AT_EXEC mode  
OCIBindObject() Set additional attributes for bind of named data type

注:
OCIBindArrayOfStruct必须先用OCIBindByPos初始化,然后在OCIBindArrayOfStruct中定义每个参数所跳过的字节数。
如:

存储方式:

 

第一条记录第二条记录 N


 SkipPara(实际就是结构体长度,即本次所有列的长度和)

 

sword OCIBindByName (
OCIStmt       *stmtp, //语句句柄
                OCIBind       **bindpp,//结合句柄,=NULL
                OCIError      *errhp,
                CONST text    *placeholder,//占位符名称
                sb4           placeh_len, //占位符长度
                dvoid         *valuep, //绑定的变量名
                sb4           value_sz, //绑定的变量名长度
                ub2           dty,  //绑定的类型
                dvoid         *indp, //指示符变量指针(sb2类型),单条绑定时为NULL,
                ub2           *alenp, //说明执行前后被结合的数组变量中各元素数据实际的长度,单条绑定时为NULL
                ub2           *rcodep,//列级返回码数据指针,单条绑定时为NULL
                ub4           maxarr_len, //最多的记录数,如果是单条绑定,则为0
                ub4           *curelep, //实际的记录数,单条绑定则为NULL
                ub4           mode //=OCI_DEFAULT
);

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

sword OCIBindArrayOfStruct (
OCIBind     *bindp,//绑定的结构句柄,由OCIBindByPos定义
                OCIError    *errhp,
                ub4         pvskip, //下一列跳过的字节数**
                ub4         indskip,//下一个指示器或数组跳过的字节数
                ub4         alskip, //下一个实际值跳过的字节数
                ub4         rcskip //下一个列级返回值跳过的字节数
);

例:
sword     swResult;
OCIBind*  hBind;
Ub4 rec_num;
Sql:  insert into student values (:p1,:p2)

单条绑定:
hBind = NULL;
swResult = OCIBindByPos(stmtp &hBind, errhp,1,ststd.tname,
sizeof(ststd.tname), SQLT_CHR, NULL,
NULL,NULL,0, NULL, OCI_DEFAULT);


批量取数据,一次取100条
Sql:  select username,age from student where username=:p1 and age=:p2

hBind = NULL;
swResult = OCIBindByPos(stmtp &hBind, errhp,1,tstd[0].tname,
sizeof(tstd[0].tname), SQLT_CHR, &tstdInd.sb2_usernmae[0],
&tstdLen.ub2_username[0],&tstdRet.ub2_username[0],100, &rec_num, OCI_DEFAULT);
swResult = OCIBindArrayOfStruct(hBind, errhp,sizeof(tstd [0]), sizeof(sb2), sizeof(ub2), sizeof(ub2));

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:

查看本文来源

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

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章