【问题标题】:Pro*C Code handling to solve ORA-01405: fetched column value is NULLPro*C 代码处理解决 ORA-01405: fetched column value is NULL
【发布时间】:2014-08-29 09:03:20
【问题描述】:

我有一个 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 则允许 UNSAFE_NULL=YES =V7 或 V8

还有其他建议吗?

【问题讨论】:

  • 使用指标变量......

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


【解决方案1】:

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

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

字符串

STRING 数据类型类似于 VARCHAR2 数据类型,除了一个 STRING 值始终以空值结尾。

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

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

【讨论】:

    【解决方案2】:

    使用指标进行空值检测:

    短 idxA, idxB;

    FETCH ... INTO :varA :idxA, :varB :idxB;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 2016-12-04
      • 1970-01-01
      • 2013-09-25
      • 2018-10-09
      • 2022-12-11
      • 1970-01-01
      • 2022-12-01
      相关资源
      最近更新 更多