文リストの実行をカーソル内のローごとに 1 回繰り返します。
[ statement-label : ] FOR for-loop-name AS cursor-name [ cursor-type ] CURSOR { FOR statement [ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ] | USING variable-name } DO statement-list END FOR [ statement-label ]
cursor-type : NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE
cursor-concurrency : BY { VALUES | TIMESTAMP | LOCK }
variable-name : identifier
NO SCROLL 句 NOSCROLL として宣言されたカーソルは、FETCHNEXT と FETCHRELATIVE0 の各シーク操作を使用して、結果セットの前方移動に制限されます。
カーソルがローを出た後は、そのローに戻ることができないため、カーソルに sensitivity の制限はありません。NO SCROLL カーソルが要求されると、SQL Anywhere は最も効率的なカーソルである asensitive カーソルを提供します。
DYNAMIC SCROLL 句 DYNAMIC SCROLL はデフォルトカーソルタイプです。DYNAMIC SCROLL カーソルでは、FETCH 文のすべてのフォーマットを使用できます。
DYNAMIC SCROLL カーソルを要求されると、SQL Anywhere は asensitive カーソルを提供します。カーソルを使用する場合、効率と一貫性の間には常にトレードオフ関係があります。Asensitive カーソルを使用すると、パフォーマンスは向上しますが一貫性が低下します。
SCROLL 句 SCROLL として宣言されたカーソルは、FETCH 文のすべてのフォーマットを使用できます。SCROLL カーソルを要求されると、SQL Anywhere は value-sensitive カーソルを提供します。
SQL Anywhere は、結果セットのメンバーシップが保証されるような方法で value-sensitive カーソルを実行します。DYNAMIC SCROLL カーソルの方が効率的です。SCROLL カーソルの一貫した動作が必要でない場合は、DYNAMIC SCROLL カーソルを使用してください。
INSENSITIVE 句 INSENSITIVE として宣言されたカーソルは、存続期間中、値とメンバーシップが固定されます。SELECT 文の結果セットはカーソルが開かれると、実体化されます。INSENSITIVE カーソルからの FETCHING は、そのカーソルを開いた接続を含むどの接続からの INSERT、UPDATE、MERGE、PUT、DELETE 文の影響も受けません。
SENSITIVE 句 SENSITIVE として宣言されたカーソルは、結果セットのメンバーシップまたは値の変更に依存します。
FOR UPDATE 句 FOR UPDATE はデフォルトです。 ORDER BY 句なしの単一テーブルのクエリの場合、または ansi_update_constraints オプションが Off に設定されている場合、カーソルのデフォルトは FOR UPDATE です。ansi_update_constraints オプションが Cursors または Strict に設定されている場合、ORDER BY 句を含むクエリ上のカーソルのデフォルトは READ ONLY です。ただし、FOR UPDATE 句を使用して、カーソルを更新可能と明示的に示すこともできます。
FOR READ ONLY 句 FOR READ ONLY として宣言されたカーソルは、UPDATE (位置付け) 文、DELETE (位置付け) 文、または PUT 文には使用できません。ORDER BY 句またはジョインを使用してカーソルに対する更新を可能にするにはコストがかかるため、2 つ以上のテーブルのジョインを含むクエリに対するカーソルは READ ONLY であり、ansi_update_constraints データベースオプションが Off でないかぎり、更新可能にすることはできません。FOR UPDATE を指定したカーソル要求への応答では、SQL Anywhere は value-sensitive カーソルまたは sensitive カーソルを提供します。insensitive カーソルと asensitive カーソルは更新できません。
FOR 文は制御文です。これを使うと、カーソル内の各ローに対して一度だけ、SQL 文のリストを実行できます。FOR 文は、カーソルに対して DECLARE を持つ複合文と同じです。また、カーソルの結果セットの中に、それぞれのカラムに対する変数の DECLARE がある複合文と同じです。複合文の後には、カーソルからローカル変数の中へローを一度フェッチし、カーソル内で各ローに対して一度だけ statement-list を実行するループが続きます。
有効なカーソルタイプには、dynamic scroll (デフォルト)、scroll、no scroll、sensitive、insensitive があります。
それぞれのローカル変数の名前とデータ型は、カーソル内で使用する statement から取り出されます。SELECT 文の場合、データ型は SELECT リスト内の式のデータ型です。名前は、SELECT リスト項目のエイリアスが存在する場合はエイリアスになります。そうでない場合は、カラムの名前となります。SELECT リスト項目のカラム参照が簡単でない場合は、エイリアスを指定します。CALL 文の場合、名前とデータ型はプロシージャ定義内の RUSULT 句から取ります。
LEAVE 文を使って、END FOR に続く最初の文から実行を再開できます。終了の statement-label を指定する場合は、開始の statement-label と一致させます。
FOR 文によって作成されるカーソルは暗黙的に WITH HOLD を使用して開かれるため、このカーソルは、ループ内で実行され、COMMIT を発生させる文によって閉じられません。
cursor-name を指定しない場合、cursor-type が cursor-name として使用されます。
なし
なし
SQL/2008 FOR 文は、オプションの SQL/2008 言語機能 P002、"Computational completeness" の一部です。FOR 文の USING 句はベンダー拡張です。DECLARE CURSOR 文では、カーソル感知性とカーソルスクロール動作のオプションの組み合わせと同様、cursor-concurrency の使用はベンダー拡張です。
次のフラグメントは、FOR ループの使い方を示します。
FOR names AS curs INSENSITIVE CURSOR FOR SELECT Surname FROM Employees DO CALL search_for_name( Surname ); END FOR; |
次のフラグメントは、FOR ループの使い方を示します。
BEGIN FOR names AS curs SCROLL CURSOR FOR SELECT EmployeeID, GivenName FROM Employees where EmployeeID < 130 FOR UPDATE BY VALUES DO MESSAGE 'emp: ' || GivenName; END FOR; END |
次の例は、プロシージャ myproc の内部で使用している FOR ループを示します。このプロシージャは、プロシージャを呼び出したときに指定したソート順に従って、Employees テーブルから上位 10 名の従業員を返します (asc は昇順、desc は降順)。
CALL sa_make_object( 'procedure', 'myproc' ) ; ALTER PROCEDURE myproc ( IN @order_by VARCHAR(20) DEFAULT NULL ) RESULT ( Surname person_name_t ) BEGIN DECLARE @sql LONG VARCHAR; DECLARE @msg LONG VARCHAR; DECLARE LOCAL TEMPORARY TABLE temp_names( surnames person_name_t ); SET @sql = 'SELECT TOP(10) * FROM Employees AS t ' ; CASE @order_by WHEN 'asc' THEN SET @sql = @sql || 'ORDER BY t.Surname ASC'; SET @msg = 'Sorted ascending by last name: '; WHEN 'desc' THEN SET @sql = @sql || 'ORDER BY t.Surname DESC'; SET @msg = 'Sorted ascending by last name: '; END CASE; FOR loop_name AS curs SCROLL CURSOR USING @sql DO INSERT INTO temp_names( surnames ) VALUES( Surname ); MESSAGE( @msg || Surname ) ; END FOR; SELECT * FROM temp_names; END ; |
asc を指定して myproc プロシージャを呼び出すと (たとえば、CALL myproc( 'asc' );
)、次のような結果が返されます。
Surname |
---|
Ahmed |
Barker |
Barletta |
Bertrand |
Bigelow |
Blaikie |
Braun |
Breault |
Bucceri |
Butterfield |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |