リファレンスガイド> TDV SQLスクリプト> SQLスクリプトプロシージャと構造> SQLスクリプトプロシージャヘッダー
 
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モディファイア
PIPEという名前の修飾子は、カーソルをストリーミングするためにSQLスクリプトで使用されます。プロシージャのパラメータ宣言でのみ使用でき、その目的は出力をパイプライン化することです。
構文
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