Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 文 » SQL 文 (E ~ O)

 

FOR 文

この文は、カーソル内の各ローに対して一度だけ、文の実行を繰り返すために使用します。

構文
[ statement-label : ]
FOR for-loop-name AS cursor-name [ cursor-type ] CURSOR
 { FOR statement  [ FOR { UPDATE cursor-concurrency | FOR 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 カーソルを提供します。asensitive カーソルを参照してください。

  • DYNAMIC SCROLL 句   DYNAMIC SCROLL はデフォルト・カーソル・タイプです。DYNAMIC SCROLL カーソルでは、FETCH 文のすべてのフォーマットを使用できます。

    DYNAMIC SCROLL カーソルを要求されると、SQL Anywhere は asensitive カーソルを提供します。カーソルを使用する場合、効率と一貫性の間には常にトレードオフ関係があります。Asensitive カーソルを使用すると、パフォーマンスは向上しますが一貫性が低下します。asensitive カーソルを参照してください。

  • SCROLL 句   SCROLL として宣言されたカーソルは、FETCH 文のすべてのフォーマットを使用できます。SCROLL カーソルを要求されると、SQL Anywhere は value-sensitive カーソルを提供します。value-sensitive カーソルを参照してください。

    SQL Anywhere は、結果セットのメンバシップが保証されるような方法で value-sensitive カーソルを実行します。DYNAMIC SCROLL カーソルの方が効率的です。SCROLL カーソルの一貫した動作が必要でない場合は、DYNAMIC SCROLL カーソルを使用してください。

  • INSENSITIVE 句   INSENSITIVE として宣言されたカーソルには、それを開いたときに決定されるメンバシップがあります。テンポラリ・テーブルは、すべてのオリジナル・ローのコピーから作成されます。INSENSITIVE カーソルからの FETCHING は、他の INSERT、UPDATE、または DELETE 文の効果を参照しません。または別のカーソル上の他の PUT、UPDATE WHERE CURRENT、DELETE WHERE CURRENT オペレーションを参照しません。INSENSITIVE カーソルからの FETCHING は、同じカーソル上の PUT、UPDATE WHERE CURRENT、DELETE WHERE CURRENT オペレーションの効果を参照します。insensitive カーソルを参照してください。

  • SENSITIVE 句   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 句を使用して、カーソルを更新可能と明示的に示すこともできます。

  • READ ONLY 句   FOR READ ONLY として宣言されたカーソルは UPDATE (位置付け) 操作や DELETE (位置付け) 操作には使用できません。ORDER BY 句またはジョインを使用してカーソルに対する更新を可能にするにはコストがかかるため、2 つ以上のテーブルのジョインを含むクエリに対するカーソルは READ ONLY であり、更新可能にすることはできません。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 と一致させます。

パーミッション

なし

関連する動作

なし

参照
標準と互換性
  • SQL/2003   永続的ストアド・モジュール機能。

次のフラグメントは、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 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