14.43 イテレータ

イテレータでは、イテランドと繰返しコントロールを指定します。

イテレータは、次の文で使用できます。

構文

iterand_decl ::=

iteration_ctl_seq ::=

pred_clause_seq ::=

stepped_control ::=

single_expression_control ::=

dynamic_sql ::=

セマンティクス

iterator

イテレータでは、イテランドと繰返しコントロールを指定します。

ループの外側の文は、iteratorを参照できません。ループの内側の文はiteratorを参照できますが、その値を変更することはできません。FOR LOOP文の実行後、iteratorは不定になります。

iterand_decl

イテランドのタイプは、暗黙的または明示的に宣言できます。明示的にイテランドを初期化することはできません。

イテランドのタイプは、ループ・ヘッダーのイテランドの後にタイプの宣言がない場合、暗黙的に宣言されます。暗黙的なタイプは、最初の繰返しコントロールによって決定されます。

表14-1 イテランドの暗黙的なタイプのデフォルト

繰返しコントロール 暗黙的なイテランドのタイプ
ステップ・コントロール PLS_INTEGER
単一式 PLS_INTEGER
カーソル制御 CURSOR%ROWTYPE
VALUES OFコントロール コレクション要素タイプ
INDICES OFコントロール コレクション索引タイプ
PAIRS OFコントロール 最初のイテランドはコレクションの索引タイプを示し、2番目のイテランドはコレクションの要素タイプを示します

pls_identifier

FOR LOOP文に対してローカルな、暗黙に宣言された変数のイテランド名。

[ MUTABLE | IMMUTABLE ]

イテランドの可変性プロパティにより、ループ本体での代入を可能にするかどうかが決まります。イテレータで指定したすべての繰返しコントロールがカーソル・コントロールの場合、イテランドはデフォルトで可変です。それ以外の場合、イテランドは不変です。イテランドのデフォルトの可変性プロパティは、イテランド変数の後ろにキーワードMUTABLEまたはIMMUTABLEを指定することで、イテランド宣言内で変更できます。可変性プロパティのキーワードは予約されていません。タイプの名前として使用することも可能です。そのような使用方法は、あいまいになります。そのため、イテランドの可変性プロパティは、タイプの名前をmutableやimmutableにする場合、イテランドの宣言内で明示的に指定する必要があります。INDICES OF繰返しコントロールのイテランドおよびPAIRS OF繰返しコントロールの索引イテランドは、可変にすることはできません。

constrained_type

イテランドは、ループ・ヘッダーでイテランドのタイプを指定するときに明示的に宣言します。イテランドに値を代入する際には、タイプに定義された制約が考慮されます。繰返しコントロールによって生成される値には、イテランドのタイプとの代入互換性が必要です。通常の変換ルールが適用されます。すべての制約違反に対して例外が発生します。

iteration_ctl_seq

複数の繰返しコントロールは、それらをカンマで区切って連鎖できます。

iteration_ctl_seqの制限:

Pairs Ofイテランドには2つのイテランドが必要になるため、Pairs Of繰返しコントロールは別の種類の繰返しコントロールと混在できません。

qual_iteration_ctl

修飾反復コントロールはREVERSEオプション、およびオプションで停止述語句やスキップ述語句を指定します。

[ REVERSE ]

オプションのキーワードREVERSEを指定すると、シーケンス内の値の順序が逆転されます。

このオプションは、コレクション・ベクトル値式で使用できます。その場合、REVERSEを指定すると、FIRSTからLASTではなく、LASTからFIRSTに向けて値が生成されます。

REVERSEの制限:
  • このオプションは、繰返しコントロールでパイプライン・ファンクションが指定されているときには使用できません。
  • 単一式の繰返しコントロールでは単一値が生成されるため、このオプションは使用できません。そのため、このキーワードは、このコントロールに対して実用的な意味を持ちません。

  • 繰返しコントロールでSQL文を指定しているときには、このオプションは使用できません。これは、問合せによって返されたレコードのシーケンスを生成します。SQL文にORDER BY句を指定することで、適切な順序に行をソートできます。

  • このオプションは、コレクションがカーソル、カーソル変数、動的SQLの場合や、パイプライン・テーブル・ファンクションを呼び出す式の場合には使用できません。

iteration_control

繰返しコントロールは、値のシーケンスをイテランドに提供します。

pred_clause_seq

繰返しコントロールは、オプションの停止述語句と、それに続くオプションのスキップ述語句で変更されることがあります。述語句に含まれる式は、BOOLEAN型にする必要があります。

[ WHILE boolean_expression ]

停止述語句により、繰返しコントロールを完全に消化できます。boolean_expressionは、ループの各反復の最初に評価されます。TRUEに評価されない場合は、繰返しコントロールが完全に消化されています。

[ WHEN boolean_expression ]

スキップ述語句により、いくつかの値についてループ本体をスキップできます。boolean_expressionが評価されます。TRUEに評価されない場合、繰返しコントロールは次の値にスキップします。

stepped_control

lower_bound .. upper_bound [ BY step ]

REVERSEが指定されていない場合、iterandの値はlower_boundから始まり、upper_boundに到達するまで、ループの反復ごとにstepずつ増加します。

REVERSEを指定すると、iterandの値はupper_boundから始まり、lower_boundに達するまで、ループの反復ごとにstepずつ減少します。upper_boundlower_boundよりも小さい場合、statementsは実行されません。

stepのデフォルト値は1です(このオプションのBY句を指定していない場合)。

lower_boundupper_boundは、数値(数値リテラル、数値変数または数値式のいずれか)に評価されます。境界の数値が指定されていない場合、PL/SQLは事前定義の例外VALUE_ERRORを呼び出します。PL/SQLでは、lower_boundupper_boundFOR LOOP文に入ったときに一度評価され、一時的なPLS_INTEGER値として格納されます(必要に応じて、最も近い整数に四捨五入されます)。

lower_boundupper_boundが等しい場合、statementsは一度のみ実行されます。

ステップ値は0 (ゼロ)より大きい値である必要があります。

single_expression_control

単一式の繰返しコントロールは、単一値を生成します。REPEATを指定すると、停止句によって繰返しコントロールが完全に消化されるまで、式が繰り返し評価されて値のシーケンスが生成されます。

single_expression_controlの制限:

REVERSEは単一式の繰返しコントロールには使用できません。

values_of_control

コレクションの要素タイプには、イテランドとの代入互換性が必要です。

indices_of_control

コレクションの索引タイプには、イテランドとの代入互換性が必要です。

INDICES OF繰返しコントロールに使用するイテランドは可変にできません。

pairs_of_control

PAIRS OF繰返しコントロールには、2つのイテランドが必要です。PAIRS OF繰返しコントロールと、それとは別の種類のコントロールを混在させることはできません。最初のイテランドは索引イテランドです。2番目は値イテランドです。それぞれのイテランドの後ろには明示的なタイプが続くことがあります。

コレクションの要素タイプには、値イテランドとの代入互換性が必要です。コレクションの索引タイプには、索引イテランドとの代入互換性が必要です。

PAIRS OF繰返しコントロールに使用する索引イテランドは可変にできません。

cursor_iteration_control

カーソルの繰返しコントロールは、明示カーソルまたは暗黙カーソルによって返されるレコードのシーケンスを生成します。カーソル定義が制御式になります。

cursor_iteration_controlの制限:

カーソルの繰返しコントロールでは、REVERSEは使用できません。

cursor_object

cursor_objectは、明示的なPL/SQLカーソル・オブジェクトです。

sql_statement

sql_statementは、繰返しコントロールで直接指定したSQL文に応じて作成される暗黙的なPL/SQLカーソル・オブジェクトです。

cursor_variable

REF CURSORオブジェクトの以前に宣言した変数の名前。

dynamic_sql

EXECUTE IMMEDIATE dynamic_sql_stmt [ USING [ IN ] (bind_argument [,] )+]

動的問合せは、カーソルまたはコレクションの繰返しコントロールで暗黙的カーソル定義のかわりに使用できます。このような構成では、デフォルトのタイプを指定できません。最初の繰返しコントロールとして使用する場合は、イテランドまたはPairs Ofコントロールの値イテランドに明示的なタイプを指定する必要があります。

オプションのUSING句は、動的SQLで許容される唯一の句です。INと1つ以上のバインド変数(カンマで区切る)を含めることのみ可能です。

dynamic_sql_stmt

SQL文を表す文字列リテラル、文字列変数または文字列式です。その型は、CHAR型、VARCHAR2型またはCLOB型である必要があります。

注意:

動的SQLを使用する場合は、セキュリティ・リスクのSQLインジェクションに注意してください。SQLインジェクションの詳細は、「SQLインジェクション」を参照してください。

  • 例5-26繰返しコントロールとしての動的SQLの使用
  • 例5-18ステップ範囲の繰返しコントロール
  • 例5-19FOR LOOP文のSTEP句
  • 例5-25カーソルの繰返しコントロール
  • 例5-22VALUES OF繰返しコントロール
  • 例5-23INDICES OF繰返しコントロール
  • 例5-24PAIRS OF繰返しコントロール