我有一个Pro * C代码连接到Oracle数据库并根据需要运行SQL查询。 一个简单的SQL查询,如下所示:
SELECT A, B FROM TBL1 WHERE A = 'a'
面临错误ORA-01405: fetched column value is NULL
注意在TBL1中,A定义为VARCHAR2(30),B是NUMBER(4,2)。
我的Pro * c版本为Pro*C/C++: Release 11.2.0.3.0
我正在使用GNU gcc系列编译器g ++版本2.95.3。
Oracle文档(http://docs.oracle.com/cd/A57673_01/DOC/api/doc/PC_22/ch03a.htm)声明
if you SELECT or FETCH a null into a host variable that has no indicator, Oracle issues the following error message:
ORA-01405: fetched column value is NULL
一个建议的补救措施是:我们可以指定UNSAFE_NULL = YES以在运行Pro * c时禁用ORA-01405消息但是当我尝试使用proc命令添加该标志时,它说,如果MODE = ORACLE和DBMS,则允许UNSAFE_NULL = YES = V7或V8
还有其他建议吗?
答案 0 :(得分:2)
自从我做过任何Pro * C以来已经好几年了,但我记得当我第一次在早期版本的Pro * C中遇到过这个问题时,你必须使用指示符变量来检查值是否为NULL。但是,当Oracle引入STRING数据类型时,情况发生了变化。我非常喜欢这个,甚至开始使用TO_CHAR数字并将它们存储到STRING。
从您链接到的文档中看到此内容:
STRING
STRING数据类型与VARCHAR2数据类型类似,但a除外 STRING值始终以null结尾。
On Input Oracle使用 指定的长度,以限制空终止符的扫描。如果为null 找不到终结符,Oracle会生成错误。如果你不 指定一个长度,Oracle假定最大长度为2000个字节。该 STRING值的最小长度为2个字节。如果是第一个字符 如果为null终止符且指定的长度为2,则Oracle会插入null 除非列被定义为NOT NULL;如果列定义为 NOT NULL,发生错误。全空值保存完整。
On输出Oracle将空字节附加到返回的最后一个字符。 如果字符串长度超过指定的长度,Oracle将截断 输出值并附加一个空字节。如果选择null, Oracle在第一个字符位置返回一个空字节。
答案 1 :(得分:0)
使用指标进行空检测:
短idxA,idxB;
FETCH ... INTO:varA:idxA,:varB:idxB;
如果值为NULL,则指示符设置为-1;