如果无法在 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
我正在尝试创建一个过程来自动执行一些查询,这些查询是我正在创建的搜索工具的一部分。
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