2012-02-25 32 views
2

IBExpert執行以下簡單的查詢,並能正常工作:爲什麼不運行這個SQL?火鳥存儲過程

SELECT 
    pd.NOME_PRODUTO, 
    es.QTDE_MINIMA 
FROM 
    TBL_ESTOQUE es, 
    TBL_PRODUTO pd 
WHERE 
    es.qtde_estoque = 0 
    AND es.produto = pd.id 
ORDER BY 
    pd.NOME_PRODUTO 

但是,如果我創建了有兩個輸出參數(見下文)

begin 
SELECT 
    pd.NOME_PRODUTO, 
    es.QTDE_MINIMA 
FROM 
    TBL_ESTOQUE es, 
    TBL_PRODUTO pd 
WHERE 
    es.qtde_estoque = 0 
    AND es.produto = pd.id 
ORDER BY 
    pd.NOME_PRODUTO 
into :nome_produto, :qtde_minima; 
suspend; 
end 

我的存儲過程得到這樣的消息:

單身選擇多行。多個行在單身人士 選擇。在proceddure「SPD_SALDO_PROD_ZERADO_ESTOQUE」第7行,列:3"

這是什麼我不明白髮生了什麼......

+6

那麼錯誤信息很清楚不是嗎?你的選擇有多少行返回? – 2012-02-25 20:51:31

回答

3
FOR SELECT ... 
INTO ... 
DO SUSPEND; 
3

rstrelba的回答顯示瞭如何解決這個問題。如果你想了解它,這裏發生了什麼事

suspend一隻火鳥存儲過程中返回一行給調用者可以以各種不同的方式使用,並且可以被認爲是類似於Python的yield聲明。:暫停操作併發回單個價值e(或行,在這種情況下),然後在調用者請求更多數據時繼續。 (由於技術原因,必須這樣做,因爲數據庫驅動程序並不總是一次拉出整個結果集。)

你有一個select查詢可以返回任意數量的值,由一個suspend。 Firebird錯誤地告訴你這可能是錯誤的。你想要做的就是把select放在一個for循環中,如rstrelba的答案所示,它將遍歷結果集併爲每行暫停一次。這可以確保調用者獲得所有結果。

+1

恐怕你有點不對。我認爲問題不在於「暫停」。但是在「進入」部分。 – EMBarbosa 2012-03-12 13:06:21