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

时间:2014-08-29 09:03:20

标签: c++ c oracle oracle11g oracle-pro-c

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

还有其他建议吗?

2 个答案:

答案 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;