FOR - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQL ストアド プロシージャおよび埋め込みSQL

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/rop1530578142648.ditamap
dita:ditavalPath
ja-JP/rop1530578142648.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

目的

テーブルから取り出した各行ごとに文を実行します。

呼び出し

実行可能形式。

ストアド プロシージャのみ。

構文





















label_name
FOR文のオプションのラベル。
終了ラベルが指定されている場合、終了ラベルと同等の開始ラベルを指定する必要があります。開始ラベルはコロン(:)で終わっている必要があります。
BEGIN…END複合文のラベル名は繰返し文内で再使用できません。1つのラベル名を入れ子のFOR文の一グループ内で再利用することはできませんが、入れ子になっていない別個の繰返し文内では再利用できます。
for_loop_variable
ループの名前。
cursor_name
カーソルの名前。
WHERE CURRENT OF句の目的語として、更新可能カーソルで使用します。
cursor_specification
カーソルとして使用される1つのSELECT文。
読み取り専用カーソルの場合、1つのSELECT文に1つのSELECTを組み込むことも、UNION、INTERSECT、MINUSのような集合演算子を使用した複数の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文を使用できます。これらの文内のテーブル名は、カーソル指定で使用したものと同じでなければなりません。
  • 定位置UPDATEでは、カーソルの現在行を複数回更新することができます。
  • 位置指定されたDELETEでは、複数回更新したカーソルの現在行を削除することができます。
位置指定された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;

関連トピック

以下に関する詳細な情報