假如绑定语句是 update TAB_ABC set A=:fd1 where B=:fd2;
如果:fd2的输入中是空值时,如何配置下面函数的参数?本人用OCIBindByPos() 和 OCIBindArrayOfStruct() 搭配进行批量操作。
sword OCIBindByPos ( 
                OCIStmt       *stmtp,    //语句句柄
                  OCIBind       **bindpp,  //结合句柄,=NULL
                OCIError      *errhp,
                ub4           position,   // 绑定的位置
                  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
        ); 
在插入时,*indp = -1即可插入NULL,但在update/delete的where中做条件就不行,
执行不报错,但结果没有达到目的。请问高手指点!
谢谢!

解决方案 »

  1. update TAB_ABC set A=:fd1 where B is null;
      

  2. 本人用的是OCI 编程,不是Proc C。另外:
    因为是批量操作,也就是说,where条件中的字段可能是空值,可能不是空值,
    批量一次有多有少;
    is null 是写死的SQL语句,
    在这里不适合。
      

  3. 看来,还是我来回答你的问题。
    1 NULL字段的输入是用过指示器来输入的。
    参数indp是指示符缓冲区,也是一个数组,每个元素是一个sb2类型的值。一般作输入用,如果此项动态参数会被输出,则也作输出用。在输入时,元素值为-1时表示NULL值输入,大于或等于0时是普通得值输入。在输出时,和函数OCIDefineByPos()里的指示符缓冲区作用相同,其值将会在提取数据后填入。其值标志着取到的数值的特殊信息。-2表示值的长度过大,且超过sb4类型的最大值,取出的值被截断,是部分值。-1表示值为NULL,因为C/C++没有NULL这个类型,因此这是判断取出的字段值是否是NULL的唯一方法。0表示数据被完整取出。大于0的值,表示取出的值的字节大小超过定义的每个值的字节大小,取出的值被截断,返回的值是被截断前的字节的大小。
    这段文字是我在书里面总结OCI的文档归纳出来的。
    对你而言,dvoid        *indp,      这个值不能为NULL,而是一个单项元素为sb2的数组,其值为-1 表示其参数值为NULL.
    2 NULL值不能用 = 运算符来比较,其返回的值即不为 TRUE,也不为 FALSE,Oracle 文档上是这么说的。 
    ----------------------------------------------------------- 
    《征服C/C++企业软件开发核心技术》 
    主题词 unix/linux 多线程 网络通讯 数据库 内存排错和性能分析 
    http://www.china-pub.com/209150
      

  4. 请问 nowplaycn ,我的这个问题有解嘛?
      

  5. 仔细读回复呀。1 一般而言,dvoid        *indp,      这个值不能为NULL,而是一个单项元素为sb2的数组,此项元素其值为-1 表示其参数值为NULL. 
    2 你必须把语句改为 update TAB_ABC set A=:fd1 where B=:fd2 or b is null, 那么,indp=NULL代入即可。不过,一般推荐把这个指针设为正常值而不是NULL
     
    ----------------------------------------------------------- 
    《征服C/C++企业软件开发核心技术》 
    主题词 unix/linux 多线程 网络通讯 数据库 内存排错和性能分析 
    http://www.china-pub.com/209150
      

  6. update TAB_ABC set A=:fd1 where B is null;
      


  7. 我这条件中B的值也是动态的,
    所以不能写成 B is null;
    有时候B的值为空
      

  8. 使用字符串拼接:str1:='update TAB_ABC set A=' + :fd1 + 'where '+ B + ' is null;';
      


  9. 这位仁兄没有理解我的意思,
    我需要的结果是绑定某个字段,
    这个字段值的缓冲区是动态填充的,
    包含各种非空值和空值,如果填入‘is null’的话,
    只是它表示字符串而不是空值。
      

  10. 网上只是这么说的:    由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数允许程序为所执行语 句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为NULL或所读取的列值是否为NULL,以及所读取的列值是否被截 取。 
    除SQLT_NTY(SQL Named DataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明: 
    作为输入变量时:(如insert ,update语句中) 
    =-1:OCI程序将NULL赋给Oracle表的列,忽略占位符结合的程序变量值 
    >=0:应用程序将程序变量值赋给指定列
      


  11. 这个我也明白,
    在insert时是对的!
    但在update、delete中做where条件时,
    就不能得到相应的结果!
      

类似问题 »