1

我有一个 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=V7 或V8

还有其他建议吗?

4

2 回答 2

2

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

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

细绳

STRING 数据类型类似于 VARCHAR2 数据类型,只是 STRING 值始终以空值结尾。

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

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

于 2014-08-29T22:49:54.843 回答
0

使用指标进行空值检测:

短 idxA、idxB;

获取...进入:varA:idxA,:varB:idxB;

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

于 2014-10-27T08:21:25.703 回答