制御ステートメントとは、構造化プログラミング言語でプログラムを作成する 方法と同様に SQL を使用できるようにする SQL ステートメントです。 ルーチンの本体、トリガー、または動的複合ステートメントで SQL 制御ステートメントを 使用できます。
この章には、SQL procedure-statement とともに、サポートされている SQL 制御ステートメントの 構文および説明があります。
SQL プロシージャー・ステートメントの情報を以下のように変更します。
この章には、SQL ルーチン、トリガー、または動的複合ステートメントのプロシージャー本体を 構成するステートメントの構文図、意味の説明、規則、および使用例があります。
構文
>>-+---------+---+-| SQL-control-statement |-+----------------->< '-label:--' '-| SQL-statement |---------' SQL-control-statement (1) |---+-ALLOCATE CURSOR statement---------+-----------------------| | (1) | +-assignment statement--------------+ | (1) | +-ASSOCIATE LOCATORS statement------+ | (1) | +-CASE statement--------------------+ | (2) | +-dynamic-compound statement--------+ +-FOR statement---------------------+ +-GET DIAGNOSTICS statement---------+ | (1) | +-GOTO statement--------------------+ +-IF statement----------------------+ +-ITERATE statement-----------------+ +-LEAVE statement-------------------+ | (1) | +-LOOP statement--------------------+ | (1) | +-procedure-compound statement------+ | (1) | +-REPEAT statement------------------+ | (1) | +-RESIGNAL statement----------------+ +-RETURN statement------------------+ +-SIGNAL ステートメント-------------+ '-WHILE statement-------------------'
注:
説明
トリガー、SQL 関数またはメソッド、動的複合ステートメントのコンテキストでは、 動的複合ステートメント、 FOR ステートメント、および WHILE ステートメントだけにラベルを付けることができます。
FOR ステートメントは、表のそれぞれの行に対してステートメントまたはステートメントのグループを実行します。
構文
>>-+---------+---FOR--for-loop-name--AS-------------------------> '-label:--' >-----+-------------------------------+--select-statement---DO--> | (1) | '-cursor-name--CURSOR FOR-------' .-------------------------------. V | >--------SQL-procedure-statement--;---+--END FOR----+--------+->< '-label--'
注:
説明
トリガー、関数、メソッド、または動的複合ステートメントでは、 select-statement はオプションで共通表式を持つ fullselect のみから構成されていなければなりません。
規則
例
下の例では、for-statement は employee 表全体を繰り返すために使用されています。 表のそれぞれの行について、SQL 変数 fullname は従業員のラストネーム、 コンマ、ファーストネーム、ブランク、ミドル・イニシアルに設定されます。 fullname のそれぞれの値は、表 tnames に挿入されます。
BEGIN DECLARE fullname CHAR(40); FOR vl AS SELECT firstnme, midinit, lastname FROM employee DO SET fullname = lastname || ',' || firstnme ||' ' || midinit; INSERT INTO tnames VALUE (fullname); END FOR END
複合ステートメントは、別のステートメントを SQL プロシージャーにグループ化します。 複合ステートメントの内部で SQL 変数、カーソル、および条件ハンドラーを宣言することができます。
新しい構文図の表題: procedure-compound-statement
.-NOT ATOMIC--. >>-+---------+--BEGIN----+-------------+------------------------> '-label:--' '-ATOMIC------' >-----+-----------------------------------------------+---------> | .-----------------------------------------. | | V | | '-----+-| SQL-variable-declaration |-+---;---+--' +-| condition-declaration |----+ '-| return-codes-declaration |-' >-----+--------------------------------------+------------------> | .--------------------------------. | | V | | '----| statement-declaration |--;---+--' >-----+-------------------------------------+-------------------> | .-------------------------------. | | V | | '----DECLARE-CURSOR-statement--;---+--' >-----+------------------------------------+--------------------> | .------------------------------. | | V | | '----| handler-declaration |--;---+--' .-------------------------------. V | >--------SQL-procedure-statement--;---+---END--+--------+------>< '-label--' SQL-variable-declaration .-,--------------------. V | |---DECLARE-------SQL-variable-name---+-------------------------> .-DEFAULT NULL-------. >-----+-data-type----+--------------------+-+-------------------| | '-DEFAULT--constant--' | '-RESULT_SET_LOCATOR--VARYING---------' condition-declaration |---DECLARE--condition-name--CONDITION--FOR---------------------> .-VALUE-. .-SQLSTATE--+-------+---. >----+-----------------------+---string-constant----------------| statement-declaration .-,-----------------. V | |---DECLARE-----statement-name---+---STATEMENT------------------| return-codes-declaration |---DECLARE----+-SQLSTATE--CHAR (5)--+---+--------------------+-| '-SQLCODE--INTEGER----' '-DEFAULT--constant--' handler-declaration |---DECLARE----+-CONTINUE-+---HANDLER--FOR----------------------> +-EXIT-----+ '-UNDO-----' .-,---------------------------------------. V .-VALUE-. | >---------+-SQLSTATE--+-------+--ストリング--+--+---------------> +-condition-name-------------------+ +-SQLEXCEPTION---------------------+ +-SQLWARNING-----------------------+ '-NOT FOUND------------------------' >----SQL-procedure-statement------------------------------------|
RETURN ステートメントはルーチンから戻るために使用されます。 SQL 関数またはメソッドの場合、関数またはメソッドの結果を返します。 SQL プロシージャーの場合、オプションで整数状況値を返します。
構文
>>-RETURN--+---------------------------------------------------------+-> +-式------------------------------------------------------+ +-NULL----------------------------------------------------+ '-+---------------------------------------+---fullselect--' | .-,--------------------------. | | V | | '-WITH-----common-table-expression---+--' >--------------------------------------------------------------><
説明
fullselect はプロシージャーからの RETURN には指定できません。
ルーチンがスカラー関数またはメソッドの場合、fullselect は 1 つの列 (SQLSTATE 42823) と、 1 つの行 (SQLSTATE 21000) を返さなければなりません。
ルーチンが行関数の場合は、1 つの行 (SQLSTATE 21505) を返さなければなりません。
ルーチンが表関数の場合は、1 つまたは複数の列を持つゼロ以上の行を返すことができます。
規則
版
例
RETURN ステートメントを使用して、成功時には状況値ゼロを、 失敗時には -200 を伴って SQL ストアード・プロシージャーから戻ります。
BEGIN ... GOTO FAIL ... SUCCESS: RETURN 0 FAIL: RETURN -200 END
SIGNAL SQLSTATE ステートメントは現在使用されていません。
SIGNAL ステートメントは、エラーまたは警告条件を通知するために使用されます。 エラーまたは警告を、オプションでメッセージ・テキストを付け、指定された SQLSTATE とともに返します。
構文
.-VALUE-. >>-SIGNAL----+-SQLSTATE--+-------+--sqlstate-string-constant--+-> '-condition-name---------------------------------' >-----+--------------------------------------------------------+->< +-SET--MESSAGE_TEXT-- = --+-variable-name--------------+-+ | '-diagnostic-string-constant-' | | (1) | '-(--diagnostic-string--)--------------------------------'
注:
説明
動的複合ステートメント、トリガー、SQL 関数、または SQL メソッドのコンテキストでは、以下の規則も適用されます。
SQLSTATE がこれらの規則にしたがっていない場合、エラーが発生します (SQLSTATE 428B3)。
版
+438 (SQLSTATE が '01' または '02' で始まっている場合)
-438 (その他の場合)
有効な SQLSTATE 値はいずれも SIGNAL ステートメントで使用できます。 ただし、プログラマーがアプリケーション用に予約された範囲に基づいて新しい SQLSTATE を定義することをお勧めします。 これにより、将来のリリースでデータベース・マネージャーによって定義される可能性のある SQLSTATE 値を 誤って使用してしまうのを避けることができます。
例
顧客番号がアプリケーションに認識されていないときにアプリケーション・エラーを通知する、 オーダー・システムの SQL プロシージャーです。ORDERS 表には CUSTOMER 表に対する外部キーが含まれており、 オーダーを入れるためには CUSTNO が存在していることが必要になります。
CREATE PROCEDURE SUBMIT_ORDER (IN ONUM INTEGER, IN CNUM INTEGER, IN PNUM INTEGER, IN QNUM INTEGER) SPECIFIC SUBMIT_ORDER MODIFIES SQL DATA LANGUAGE SQL BEGIN DECLARE EXIT HANDLER FOR SQLSTATE VALUE '23503' SIGNAL SQLSTATE '75002' SET MESSAGE_TEXT = 'Customer number is not known'; INSERT INTO ORDERS (ORDERNO, CUSTNO, PARTNO, QUANTITY) VALUES (ONUM, CNUM, PNUM, QNUM); END