Pro*C代码处理以解决ORA-01405:提取的列值为NULL
Pro*C Code handling to solve ORA-01405: fetched column value is 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;
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 如何设置一个范围来提取我想要获得的信息
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 从字符串中提取整数并形成一个数组
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 从 std::vector<无符号字符>切片中提取 int?
- 在C++中使用重载提取运算符时出现问题
- 简化__VA_ARGS__问题:无法提取 NULL
- 如何避免SOCI错误:提取了Null值,但未定义指示符
- Pro*C代码处理以解决ORA-01405:提取的列值为NULL