现在要实现这样的功能!
create table tab1(a int, b varchar(10));
insert into tab1 values(1, 'abc');
insert into tab1 values(2, 'abcd');
insert into tab1 values(3, null);
insert into tab1 values(4, 'abcx');
采用OCI一次bind来实现,由于其中有字段值为null,上次绕开了这个问题来实现的,现在没办法绕了就得解决。 今天学习了一下! (看来还是直面解决问题的好,今天不解决明天还是一样会来的)
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 );
indp的合理使用就可以解决了,原来一致用NULL的。看看OCI文档就明白了,
----------
下面是一篇不错的OCI文章! 引用了指示变量这一小部分!
指示器变量:
由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数允许程序为所执行语句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为 NULL或所读取的列值是否为NULL,以及所读取的列值是否被截取。
除SQLT_NTY(SQL Named DataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明:
作为输入变量时:(如insert ,update语句中)
From:
http://www.chinaunix.net/jh/19/530742.html=========================================================
2008-08-04 今天有遇到这个问题:
sword OCIDefineByPos ( OCIStmt *stmtp,
OCIDefine **defnpp,
OCIError *errhp,
ub4 position,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *rlenp,
ub2 *rcodep,
ub4 mode );
用Define取数据的时候也必须设置indp为什么呢? 我原来只设置了一个rlenp,个人认为一个长度变量就可以控制取出来的数据长度的,但我细细想来不是这样的,null数据怎么办呢?
注意:null数据可以长度为0的数据,在Oracle中他们是不同的数据,那这样长度变量就没办法表示了。