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