2015-10-14 33 views
6

我有一個表t與一列int我有一些行。 我想循環它。當然,我可以爲此寫一個選擇查詢。但我學習程序,並寫了一個程序,如何在火鳥中暫停工作?

set term ^; 
create procedure qt returns(a int) as 
begin 
    for select i from t into :a do 
     suspend; 
end^ 
set term ;^ 

但是,當我把這個過程,我只得到一個行回來,

execute procedure qt; 

我看,

  A 
============ 
      1 

我想我不明白suspend

回答

8

其中有SUSPEND的存儲過程就是所謂的可選擇過程。您可以使用SELECT執行它們:

SELECT * FROM qt 

SELECT * FROM qt() 

EXECUTE PROCEDURE聲明僅適用於生產單一行結果的程序。如果您將它用於可選存儲過程,則它只會生成一行(並在遇到SUSPEND時退出)。

在回答您的關於什麼是記錄這個查詢:

  • 177頁上的Interbase 6.0語言參考說:

    掛起不應該在一個可執行程序中使用。

  • 在178頁它顯示的SUSPENDEXITEND在可選擇的和可執行的程序(略作修改,以適應)的行爲的一個表:
Procedure type SUSPEND    EXIT    END 
Selectable  • Suspends execution Jumps to final END • Returns control 
       of procedure until       to application 
       next FETCH is issued      • Sets SQLCODE to 100 
       • Returns output        (end of record stream) 
       values 

Executable  • Jumps to final END Jumps to final END • Returns values 
       • Not recommended       • Returns control 
                  to application 
  • 對於在存儲過程(如第178頁所示),可以生成多行,第179頁描述了與SELECT一起執行並與EXECUTE PROCEDURE一起執行時的行爲差異。
+0

非常感謝。這是在Firebird文檔中寫的地方嗎?因爲我從來沒有讀過這個。 – ericj

+0

@ericj我需要看看這個;我現在沒有時間這樣做。 –

+1

@ericj我已經使用Interbase 6語言參考中的信息更新了我的答案。 –