2015-10-14 39 views
6

私はint型の1つの列iを持つテーブルtをいくつかの行に持っています。 私はそれをループしたいです。もちろん、私はこれに対する選択クエリを書くことができます。しかし、私は私が考える手順を学習し、手順を書いた、Firebirdでサスペンドはどのように機能しますか?

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

しかし、私は見る私は、このプロシージャを呼び出すとき、私は戻って1行を取得し、

execute procedure qt; 

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

ています私は理解していないsuspend

答えて

8

この中にSUSPENDを持つストアドプロシージャは、いわゆる選択可能プロシージャです。あなたはSELECTを使用してそれらを実行します。

SELECT * FROM qt 

または

SELECT * FROM qt() 

EXECUTE PROCEDURE文が単一行だけの結果を生成手順についてです。選択可能なストアドプロシージャに使用すると、1行しか生成されません(そして、SUSPENDに達すると終了します)。これについて文書化されているかについてのお問い合わせに対応して

  • 177ページのInterbase 6.0言語リファレンスは言う:実行可能な手順で使用すべきではありません

    はSUSPEND。ストアドプロシージャの

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 
  • (:これは、選択及び実行(わずかに適合するように変更された)の手順でSUSPENDEXITENDの挙動の表を示すページ178で

  • 179ページ)は、複数の行を生成する可能性があるため、SELECTで実行したときの動作の相違点を説明し、EXECUTE PROCEDUREで実行します。
+0

ありがとうございました。これはFirebirdの文書に書かれていますか?私はこれを読んだことがないので。 – ericj

+0

@ericj私はそれを見る必要があります。私は今それを行う時間がありません。 –

+1

@ericj Interbase 6の言語リファレンスからの情報で自分の答えを更新しました。 –

関連する問題