我想知道是否有人能告诉我Informix中关于表达式等的点(。)的任何特殊含义。
例如在存储过程中,我看到它与整数,小数和字符一起使用,并且有一件事让我很烦恼:
if value = '.' then
//do something
end if
当value的类型为numeric(5,1)并且它等于0.0时,上面的表达式验证为true
我试过环顾四周,找不到有关点如何处理的信息,但似乎是“0.0 ='。” “验证为真。
答案 0 :(得分:2)
您能否显示数据类型和说明问题的工作存储过程?
在这种情况下,不应该有任何特殊含义。它是一个字符串,没有数值应该等于它;如果将数字转换为字符串,则不会有任何内容(对于NULL)或至少一个数字,两者都不与字符串'。'相同,如果字符串'.'
转换为数字,转换应该失败(可以说是在创建过程时,当然是在运行时)。
令我困惑的一件事是你所展示的语法不是SPL语法。虽然I4GL确实如此,但SPL并没有使用'end if'。实际上,SPL(存储过程语言)仅将END与匹配的BEGIN结合使用。
我的记忆似乎失败了,我不应该在午夜之前尝试阅读手册。
看来这段代码也做了我不希望的事情......
+ set debug file to "/tmp/x1";
SET DEBUG FILE TO: Rows processed = 0
+ drop procedure so2139024();
DROP PROCEDURE: Rows processed = 0
+ create procedure so2139024() returning int as rv;
define value numeric(5,1);
define rv integer;
trace on;
let rv = 0;
let value = 0.0;
if value = '.' then
let rv = 1;
end if;
return rv;
end procedure;
CREATE PROCEDURE: Rows processed = 0
+ execute procedure so2139024();
1
EXECUTE PROCEDURE: Rows processed = 1
所以,出于某种原因,这种比较是有效的;零值比较等于点。这是在MacOS X 10.6.2上使用IBM Informix Dynamic Server 11.50.FC6(和SQLCMD 86.04,使用CSDK 3.50.FC4构建,但使用3.50.FC6运行)测试的。
调试文件包含:
trace on
expression:(= value, ".")
evaluates to t
let rv = 1
expression:rv
evaluates to 1
procedure so2139024 returns 1
iteration of cursory procedure so2139024
先验,这应该通过IBM / Informix技术支持报告。我认为它很可能是某种类型的错误,但我不知道它是如何得出答案的。我也会检查后门频道。
后门频道显示可能的问题是ESQL / C库中的函数deccvasc()
(也由服务器内部使用)错误处理字符串'。'。
此处的ESQL / C测试代码显示:
#include <stdio.h>
#include "dumpesql.h"
int main(void)
{
dec_t d;
int rc = deccvasc(".", 1, &d);
printf("rc = %d\n", rc);
dump_decimal(stdout, "Decimal", &d);
return(0);
}
dump_decimal()函数是非标准函数,但是从十进制结构中输出信息。输出是:
rc = 0
DECIMAL: Decimal -- address 0x7FFF5FBFF090
E: -64, S = 1 (+), N = 0, M = value is ZERO
因此,服务器(错误地)接受'。'作为零的有效表示,而不是报告错误。目前,您必须编辑存储过程以使其更有意义 - 不清楚测试应该实现什么,但显然没有正确编写。 (这并不否认服务器中也存在错误。)请将此情况报告给IBM / Informix技术支持。