Pro*C代码处理以解决ORA-01405:提取的列值为NULL



我有一个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

一个建议的补救措施是:我们可以在运行Pro*c时指定UNSAFE_NULL=YES来禁用ORA-01405消息,但当我尝试用proc命令添加该标志时,它会说,如果MODE=ORACLE和DBMS=V7或V8 ,则允许UNSAFE_NULL=YES

还有其他建议吗?

我做任何Pro*C已经好几年了,但我记得我第一次在早期版本的Pro*C中遇到这个问题时,你必须使用指示符变量来检查值是否为NULL。然而,当Oracle引入STRING数据类型时,情况发生了变化。我非常喜欢这个,我甚至开始to_CHAR数字并将它们存储到字符串中。

请从您链接到的文档中查看:

字符串

STRING数据类型与VARCHAR2数据类型类似,只是STRING值总是以null结尾。

在输入时,Oracle使用指定的长度来限制对null终止符的扫描。如果为null找不到终止符,Oracle生成错误。如果没有指定长度,Oracle假定最大长度为2000字节。这个STRING值的最小长度为2个字节。如果第一个字符是一个null终止符,并且指定的长度为2,Oracle插入一个null除非该列被定义为NOT NULL;如果列定义为NOT NULL,则发生错误。一个全空白的值将原封不动地存储。

输出时,Oracle会在返回的最后一个字符后面附加一个空字节。如果字符串长度超过指定长度,Oracle将截断输出值,并附加一个空字节。如果空被选择,Oracle在第一个字符位置返回一个空字节。

使用指示符进行空检测:

短idxA、idxB;

获取。。。INTO:varA:idxA,:varB:idxB;

如果该值为NULL,则将指示符设置为-1;

最新更新