FOR - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/xqq1557098602407.ditamap
dita:ditavalPath
ja-JP/xqq1557098602407.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

目的

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

呼び出し

実行可能形式。

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

構文

[ label_name : ] FOR for_loop_variable
  AS [ cursor_name CURSOR FOR ] cursor_specification
  DO statement [...]
  END FOR [ label_name ] ;
cursor_specification
SELECT cursor_spec [,...]
  FROM {
    table_name [,...] |

    table_name {
      INNER |
      { LEFT | RIGHT | FULL } OUTER
    } JOIN table_name ON condition
  }
statement
{ SQL_statement |
  compound_statement |
  assignment_statement |
  condition_statement |
  [ label_name : ] iteration_statement [ label_name ] |
  ITERATE label_name |
  LEAVE label_name
}
compound_statement
[ label_name : ] BEGIN
  [ local_declaration ] [...]
  [ cursor_declaration ] [...]
  [ condition_handler ] [...]
  [ statement; ] [...]
END [ label_name ] ;
assignment_statement
SET assignment_target = assignment_source
condition_statement
{ CASE_statement | IF_statement }
iteration_statement
{ WHILE conditional_expression
    DO statement; [...] |

  LOOP
    statement; [...]
  END LOOP |

  FOR for_loop_variable AS [ cursor_name CURSOR FOR ] cursor_specification
    DO statement; [...]
  END FOR |

  REPEAT
    statement; [...]
    UNTIL conditional_expression
  END REPEAT
}
cursor_spec
{ column_name [ [AS] alias_name ] |

  expression [AS] alias_name |

  *
}
local_declaration
DECLARE {
  variable_name [,...] data_type [ DEFAULT { literal | NULL } ] |
  condition_name CONDITION [ FOR SQLSTATE [VALUE] sqlstate_cod ]
} ;
cursor_declaration
DECLARE cursor_name [ [NO] SCROLL ] CURSOR
  [ WITHOUT RETURN |
    WITH RETURN [ONLY] [ TO { CALLER | CLIENT } ]
  ]
  [ FOR { cursor_specification [ FOR { READ ONLY | UPDATE } ] |
          statement_name
        } 
  ] ;
condition_handler
DECLARE { CONTINUE | EXIT } HANDLER FOR
  { 
    { SQLSTATE [ VALUE ] sqlstate_code | condition_name } [,...] |

    { SQLEXCEPTION | SQLWARNING | NOT FOUND } [,...]

  } handler_action_statement ;
IF_statement
<IF>を参照してください。
CASE_statement
<CASE>を参照してください。
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;

関連トピック

以下に関する詳細な情報