如果无法在 Firebird 存储过程中正确识别空字符串

If can't eval identify empty string correctly in Firebird stored procedure

我正在尝试创建一个过程来自动执行一些查询,这些查询是我正在创建的搜索工具的一部分。

create or alter procedure buscaExactPaisSS
    (palavra varchar(500))
returns
    (seriePK integer)
as
begin
    if (:palavra is null or :palavra = '') then
    begin
        for
            select seriesetorial.codserie
                from seriesetorial
                where codserie not in (select codserie from localidaderelset)
            into :seriePK
        do
        begin
            suspend;
        end
    end
    else
    begin
        for
            select seriesetorial.codserie
                from seriesetorial, localidade, localidaderelset
                where lower(localidade.nome) = lower(:palavra)
                    and localidaderelset.codlocalidade = localidade.codlocalidade
                    and seriesetorial.codserie = localidaderelset.codserie
                into :seriePK
        do
        begin
            suspend;
        end
    end
end!

但是,该过程总是 returns 第一种情况的结果,即当 palavra 为 null 或 '' 时。这是为什么?我该如何解决这个问题?

编辑 - 2017 年 3 月 16 日:

这个功能其实是对的。希望这至少可以作为 FB 的 PSQL 可变用法的工作过程的示例。

问题出在存储过程之外的代码上。如果你稍微简化一下,你可以看到这两个条件都有机会被正确执行:

CREATE OR ALTER PROCEDURE BUSCAEXACTPAISSS (PALAVRA VARCHAR(500))
RETURNS (
    SERIEPK INTEGER
)
AS
begin
    if (:palavra is null or :palavra = '') then
    begin
        for
            select 0 FROM someTable
            into :seriePK
        do
        begin
            suspend;
        end
    end
    else
    begin
        for
            select 1 FROM someTable
                into :seriePK
        do
        begin
            suspend;
        end
    end
end;

尝试#1:

EXECUTE PROCEDURE buscaExactPaisSS '77'

1

尝试#2:

EXECUTE PROCEDURE buscaExactPaisSS ''

0