SQL スクリプト プロシージャ ヘッダー

SQL スクリプトのプロシージャ宣言は、プロシージャの入力パラメーターと出力パラメーターを定義します。プロシージャを呼び出すには、「CALL」を参照してください。

構文

PROCEDURE <procedureName> ( [<parameterList>] ) ]
	<statement>

プロシージャの構文の括弧はオプションです。括弧がある場合は、空にすることも、パラメーターのリストを含めることもできます。

備考

パラメーター リスト (<paramList>) は、次の形式のパラメーターのカンマ区切りリストです。
{ IN | INOUT | OUT } <parameterName> <dataType>
パラメーターのデータ タイプ (<dataType>) は、ROW を除く、「データ タイプ」されている任意の型にすることができます。
プロシージャ宣言内のメイン複合ステートメントで定義された PUBLIC データ タイプを使用できます (プロシージャの構文では <compoundStatement> で示されます)。このようにして、パラメーターを常にプリミティブにするのではなく、名前付きの型として定義できます。

PROCEDURE init_table (IN employee_id INTEGER) 
  BEGIN
    INSERT INTO T (empid) VALUES (employee_id) ;
  END
PROCEDURE cur_month (OUT x INTEGER) 
  BEGIN
    SET x = MONTH (CURRENT_DATE () ) ;
  END
PROCEDURE inc (INOUT x INTEGER) 
  BEGIN
    SET x = x + 1;
  END
PROCEDURE inc (IN x INTEGER) 
 BEGIN
    SET x = 5; -- Error
  END

PIPE 修飾子

カーソルをストリーミングするために、SQL スクリプトで PIPE という名前の修飾子が使用されます。プロシージャ パラメーターの宣言でのみ使用でき、その目的は出力をパイプライン処理することです。

構文

IN <parameterName> PIPE <cursorDataType>
OUT <parameterName> PIPE <cursorDataType>

備考

PIPE 修飾子は、任意の IN または OUT カーソル データ タイプに適用できます。
PIPE 修飾子は、INOUT パラメーターまたは非カーソル データ タイプでは使用できません。
PIPE 修飾子を持つ IN パラメーターには、現在のプロシージャの IN または OUT パラメーターから取得される任意の PIPE 変数を渡すことができます。
PIPE 修飾子を持つ OUT パラメーターには、PIPE と同じスキーマを持つカーソル変数を渡す必要があります。
PROCEDURE 内では、PIPE 変数 (IN または OUT) を INSERT ステートメントで使用できます。詳細については、「INSERT」を参照してください。
IN パラメーターに PIPE 修飾子を指定したプロシージャは、別のスレッドでは実行されません。
OUT パラメーターに PIPE 修飾子を指定したプロシージャは、別のスレッドで実行されます。呼び出し元のプロシージャは、パイプライン プロシージャが実行を開始するとすぐに実行を継続します。呼び出し元のプロシージャは、OUT カーソルがすでに初期化されていることを検出し、カーソルを開き、そこからフェッチできます。(詳細については、「FETCH」を参照してください。)ただし、呼び出し元のプロシージャが非 PIPE OUT パラメーターにアクセスする場合、呼び出し元のプロシージャは、パイプライン化されたプロシージャが実行を終了するまでブロックされます。これは、非 PIPE 出力の最終値がプロシージャが完了するまで分からないためです。
PIPE 修飾子は、EXECUTE IMMEDIATE ステートメント内の INSERT ステートメントに含めることができます。

次のプロシージャでは、すべての名前が逆になっているカーソルが返されます。

PROCEDURE reverse_all (OUT result PIPE (rev_name VARCHAR) ) 
BEGIN
DECLARE c CURSOR FOR SELECT name FROM /shared/T;
DECLARE name VARCHAR;
OPEN c;
REPEAT
FETCH c INTO name;
CALL /shared/reverse (name, name) ;
INSERT INTO result (rev_name) VALUES (name) ;
UNTIL NOT c.FOUND
END REPEAT;
END