目的
テーブルから取り出した各行ごとに文を実行します。
呼び出し
実行可能形式。
ストアド プロシージャのみ。
構文
- label_name
- FOR文のオプションのラベル。
- for_loop_variable
- ループの名前。
- cursor_name
- カーソルの名前。
- cursor_specification
- カーソルとして使用される1つのSELECT文。
- statement
- 1つ以上のDML文、DDL文、DCL文(動的SQL文を含む)、または制御文(BEGIN…END複合文を含む)。
ANSI準拠
FORは、ANSI/ISO SQL:2011に準拠しています。
許可
FORには、以下の権限が必要です。
- 特定のcursor_specificationで参照されるデータベース オブジェクトに対するSELECT権限。
- カーソルが更新可能の場合は、UPDATEまたはDELETE権限。
DECLARE CURSOR文とFOR文
FOR文には、DECLARE CURSOR文が含まれます。
LEAVEおよびITERATE
FORブロック内ではLEAVEおよびITERATE文を実行することができます。
カーソル指定のための相関名の使用
カーソル内の列や式の別名を、標準のobject AS correlation_name構文によって定義することができます。別名のあるオブジェクトをループ内で参照する場合は、そのオブジェクトをfor_loop_variable名で修飾する必要があります。
別名のないカーソル式をループ内で参照することはできません。
更新可能カーソルと読み取り専用カーソル
更新可能(位置指定)カーソルは、クエリーのためにアプリケーションによって定義されたカーソルであり、結果行を更新するためにも使用できます。
FORループ内でカーソルを参照する少なくとも1つの位置指定されたDELETEまたは位置指定されたUPDATEが存在すれば、そのカーソルは更新可能です。
更新可能カーソルと読み取り専用カーソルをストアド プロシージャで使用する場合の違いは以下のとおりです。
更新可能カーソル | 読み取り専用カーソル |
---|---|
ANSIトランザクション モードでのみ使用可能です。 | ANSIトランザクション モードとTeradataトランザクション モードで使用可能です。 |
位置指定されたDELETEまたはUPDATE文を使用できます。これらの文内のテーブル名は、カーソル指定で使用したものと同じでなければなりません。
|
位置指定されたDELETEまたはUPDATE文は使用できません。 |
FORループ内のSQL文のルール
- すべてのDML文(CALL、位置指定されたUPDATE、および位置指定されたDELETEなど)を指定することができます。
- すべての制御文を指定することができます。
- トランザクション文は、読み取り専用カーソルでのみ使用できます。更新可能カーソルでは指定できません。
- SQL文で参照されるそれぞれのローカル変数、パラメータ、列、相関名、またはステータス変数は、事前に宣言されている必要があります。
FORカーソルのルール
- ABORT、COMMIT、およびROLLBACK文は、更新可能なカーソルでは使用できません。
これらの文のいずれかを実行しようとすると、実行時エラーが戻されます。
- カーソル指定では、警告コード3999を戻すことはできません。
- カーソル指定にWITH…BY句を含めることはできません。
- カーソルの指定にUNION演算子が含まれる場合、参照される相関名や列名は、最初のSQL SELECT文で使用されている相関名または列名でなければなりません。
FORループ変数のルール
- 入れ子のFOR繰返しループで使用する場合、FORループ変数の名前は固有でなければなりません。
- FORループ変数の名前は、FORループ文内のカーソル名や相関名と同じにすることができます。
- 繰返し文内の制御文以外のSQL文でFORループ変数を使用する場合は、その先頭にコロン(:)文字をつける必要があります。
- FORループ内の未修飾記号は、変数名またはパラメータ名とみなされます。
FORループ相関名のルール
- 相関名は、FORループ文内で固有でなければなりません。ただし、入れ子のFORループ文と入れ子でないものに同じ相関名を使用することができます。
- 相関名は、FORループ文内のFORループ変数およびカーソルの名前と同じにすることができます。
- 列と相関名は、繰返し文内の制御文を含むSQL文で参照される場合、FORループ変数で修飾する必要があります。
- 列または相関名が修飾されていないと、列および相関名の参照はパラメータまたはローカル変数のどちらであるかを検査されます。
- FORループ文の相関名の有効範囲は文の本文です。
FORループ カーソル名のルール
- 入れ子のFOR繰返し文で使用する場合、カーソル名は固有でなければなりません。
- カーソル名は、FOR文内のFORループ変数と同じにするか、または相関名あるいは列名と同じにすることができます。
- カーソル名の適用範囲は、それが定義されているFOR文に限定されます。FOR文が入れ子になっている場合、入れ子の外のFOR文に関連づけられているカーソル名は、内側のFOR文にある文で参照することができます。
例: FORループの挿入
L1: FOR CustCursor AS c_customer CURSOR FOR SELECT CustomerNumber AS Number ,CustomerName AS Name ,(Amount + 10000) a FROM customer DO SET hCustNbr = CustCursor.Number; SET hCustName = CustCursor.Name; SET hAmount = CustCursor.a + CustCursor.a * 0.20; INSERT INTO Cust_temp VALUES (hCustNbr, hCustName); END FOR L1;
例: FORループの削除
FOR CustCursor AS c_customer CURSOR FOR SELECT CustomerNumber ,CustomerName FROM Customer DO SET hCustNbr = CustCursor.CustomerNumber; SET hCustName = CustCursor.CustomerName; DELETE FROM Customer WHERE CURRENT OF c_customer; END FOR;
例: FORループの更新
L1: FOR CustCursor AS c_customer CURSOR FOR SELECT CustomerNumber AS Number ,CustomerName AS Name ,(Amount + 10000) a FROM Customer DO SET hCustNbr = CustCursor.Number; SET hCustName = CustCursor.Name; SET hAmount = CustCursor.a + CustCursor.a * 0.20; IF hAmount > 50000 THEN hAmount = 500000; END IF; UPDATE customer SET amount = hAmount WHERE CURRENT OF c_customer; INSERT INTO Cust_temp VALUES (hCustNbr, hCustName); END FOR;
関連トピック
以下に関する詳細な情報
- DECLARE CURSOR文とFOR文の違いについては、DECLARE CURSOR文およびFOR文のカーソルを参照してください。
- LEAVE文とITERATE文については、ITERATEおよびLEAVEを参照してください。