Firebird的执行语句,其中bigint命名为输入参数

时间:2013-12-12 18:55:05

标签: firebird firebird2.5

假设我有这样的代码:

execute block
as
declare var_mask bigint;
declare var_dummy int;
begin
    var_mask = bin_shl(1, (64 - 1));

    execute statement ('
select first 1 null
from rdb$database
where bin_and(cast(0 as bigint), :var_mask) <> cast(0 as bigint)
    ')
    (var_mask := var_mask)
    into :var_dummy
    ;
end

这个给出了很好的arithmetic exception, numeric overflow, or string truncation. numeric value is out of range.

为了使其工作,我必须对变量进行显式转换:

execute block
as
declare var_mask bigint;
declare var_dummy int;
begin
    var_mask = bin_shl(1, (64 - 1));

    execute statement ('
select first 1 null
from rdb$database
where bin_and(cast(0 as bigint), cast(:var_mask as bigint)) <> cast(0 as bigint)
    ')
    (var_mask := var_mask)
    into :var_dummy
    ;
end

有人知道为什么吗?类型信息应该携带,不是吗?

2 个答案:

答案 0 :(得分:3)

因为BIN_AND将第二个参数描述为INTEGER,即使将BIGINT传递给第一个参数也是如此。这是好还是坏都需要讨论。

答案 1 :(得分:1)

要添加到Adriano的回答中,类型信息实际上没有 - 实际上更多here来自我。)。