2017-03-15 22 views
1

我試圖創建一個過程來自動化一些查詢,這些查詢是我創建的搜索工具的一部分。如果不能在Firebird存儲過程中正確識別空字符串

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! 

但是,該過程總是返回結果爲第一種情況下,即,當palavra是null或「」。這是爲什麼?我該如何解決?

編輯 - 16/03/2017:

這個功能實際上是正確的。希望這至少可以作爲FB的PSQL變量使用過程的一個例子。

+0

除了使用':palavra'而不是'palavra'(沒有':'!)),我沒有看到存儲過程有任何明顯的錯誤。你怎麼稱呼它?你可能要仔細檢查你的存儲過程是否真的是你想象的那樣(通過檢查數據庫中的源代碼),也許你用來執行create procedure語句的組件用'null'代替':palavra'。 –

+0

是的,只是意識到這個功能是正確的。感謝您的輸入! – RafaelCruz

回答

2

問題在於您的代碼不在存儲過程中。如果你把它簡化一下,你可以看到,這兩個條件得到正確執行的機會:

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' 

嘗試# 2:

EXECUTE PROCEDURE buscaExactPaisSS '' 
+0

你是絕對正確的,我一定非常疲倦,並試圖使用一個無效的輸入作爲過程,也就是返回值爲空的值。 – RafaelCruz