假如绑定语句是 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中做条件就不行,
执行不报错,但结果没有达到目的。请问高手指点!
谢谢!
如果: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中做条件就不行,
执行不报错,但结果没有达到目的。请问高手指点!
谢谢!
因为是批量操作,也就是说,where条件中的字段可能是空值,可能不是空值,
批量一次有多有少;
is null 是写死的SQL语句,
在这里不适合。
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
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
我这条件中B的值也是动态的,
所以不能写成 B is null;
有时候B的值为空
这位仁兄没有理解我的意思,
我需要的结果是绑定某个字段,
这个字段值的缓冲区是动态填充的,
包含各种非空值和空值,如果填入‘is null’的话,
只是它表示字符串而不是空值。
除SQLT_NTY(SQL Named DataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明:
作为输入变量时:(如insert ,update语句中)
=-1:OCI程序将NULL赋给Oracle表的列,忽略占位符结合的程序变量值
>=0:应用程序将程序变量值赋给指定列
这个我也明白,
在insert时是对的!
但在update、delete中做where条件时,
就不能得到相应的结果!