Informix:dot(。)的含义?

时间:2010-01-26 11:28:27

标签: sql stored-procedures informix

我想知道是否有人能告诉我Informix中关于表达式等的点(。)的任何特殊含义。

例如在存储过程中,我看到它与整数,小数和字符一起使用,并且有一件事让我很烦恼:

if value = '.' then
  //do something
end if

当value的类型为numeric(5,1)并且它等于0.0时,上面的表达式验证为true

我试过环顾四周,找不到有关点如何处理的信息,但似乎是“0.0 ='。” “验证为真。

1 个答案:

答案 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技术支持。