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