この文は、カーソルを宣言するために使用します。カーソルはクエリの結果を操作する主要な手段です。
DECLARE cursor-name [ UNIQUE ] [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR FOR { select-statement | statement-name [ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ] | call-statement }
DECLARE cursor-name [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR { FOR select-statement [ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ] | FOR call-statement | USING variable-name }
cursor-name : identifier
statement-name : identifier | hostvar
variable-name : identifier
cursor-concurrency : BY { VALUES | TIMESTAMP | LOCK }
UNIQUE 句 カーソルが UNIQUE として宣言されている場合、クエリは各ローをユニークに識別するのに必要なすべてのカラムを強制的に返します。このため、プライマリ・キーまたはユニークなテーブル制約内のカラムのすべてが、確実に返ることになります。必須であってもクエリに指定されていなかったカラムは、結果セットに追加されます。
UNIQUE カーソル上で実行された DESCRIBE は、インジケータ変数の中に次の追加のオプションを設定します。
DT_KEY_COLUMN カラムはローに対するキーの一部です。
DT_HIDDEN_COLUMN カラムがクエリに追加されました。カラムはローをユニークに識別するために必要です。
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 statement-name PREPARE 文を使用して文に名前を付けます。作成された SELECT または CALL のためにだけカーソルを宣言できます。
FOR UPDATE | READ ONLY FOR READ ONLY として宣言されたカーソルは UPDATE (位置付け) 操作や DELETE (位置付け) 操作には使用できません。FOR UPDATE はデフォルトです。
ORDER BY 句なしの単一テーブルのクエリの場合、または ansi_update_constraints オプションが Off に設定されている場合、カーソルのデフォルトは FOR UPDATE です。ansi_update_constraints オプションが Cursors または Strict に設定されている場合、ORDER BY 句を含むクエリ上のカーソルのデフォルトは READ ONLY です。ただし、FOR UPDATE 句を使用して、カーソルを更新可能と明示的に示すこともできます。ORDER BY 句またはジョインを使用してカーソルに対する更新を可能にするにはコストがかかるため、2 つ以上のテーブルのジョインを含むクエリに対するカーソルは READ ONLY であり、更新可能にすることはできません。
FOR UPDATE を指定したカーソル要求への応答では、SQL Anywhere は value-sensitive カーソルまたは sensitive カーソルを提供します。insensitive カーソルと asensitive カーソルは更新できません。
USING variable-name ストアド・プロシージャの内部でのみ使用します。この変数はカーソルの SELECT 文を含む文字列です。この変数は DECLARE を処理するときに使用するため、次のいずれかの方法で指定します。
プロシージャへのパラメータ。次に例を示します。
CREATE FUNCTION GetRowCount( IN qry LONG VARCHAR) RETURNS INT BEGIN DECLARE crsr CURSOR USING qry; DECLARE rowcnt INT; SET rowcnt = 0; OPEN crsr; lp: LOOP fetch crsr; IF SQLCODE <> 0 THEN LEAVE lp END IF; SET rowcnt = rowcnt + 1; END LOOP; RETURN rowcnt; END; |
この変数に値を割り当ててから、別の BEGIN... END 内にネストします。次に例を示します。
CREATE PROCEDURE get_table_name( IN id_value INT, OUT tabname CHAR(128) ) BEGIN DECLARE qry LONG VARCHAR; SET qry = 'SELECT table_name FROM SYS.SYSTAB ' || 'WHERE table_id=' || string(id_value); BEGIN DECLARE crsr CURSOR USING qry; OPEN crsr; FETCH crsr INTO tabname; CLOSE crsr; END END; |
BY VALUES | TIMESTAMP | LOCK 句 Embedded SQL では、SELECT 文内またはカーソル宣言内に構文を含めることで、同時実行性の仕様を設定できます。ペシミスティックまたはオプティミスティックの同時実行性をカーソル・レベルに選択できます。このとき、DECLARE CURSOR 文または FOR 文を使用したオプション、または同時実行性を設定する特定のプログラミング・インタフェースの API が使用されます。文が更新可能で、カーソルが特定の同時制御メカニズムを指定しない場合、文の指定が使用されます。構文は次のとおりです。
FOR UPDATE BY LOCK 句 データベース・サーバは、FETCH した結果セットのローに対して、意図的なロー・ロックをかけます。このロックは長期間のロックであり、トランザクションが COMMIT または ROLLBACK されるまで保持されます。
FOR UPDATE BY { VALUES | TIMESTAMP } データベース・サーバは、keyset-driven カーソルを利用して、結果セットをスクロールするときにローが変更または削除されたときにアプリケーションへ通知できるようにします。
DECLARE CURSOR 文は、SELECT 文または CALL 文に対して指定された名前を持つカーソルを宣言します。Watcom-SQL のプロシージャ、トリガ、またはバッチの場合、DECLARE CURSOR 文は、BEGIN キーワードの直後に、他の宣言とともに指定する必要があります。また、カーソル名をユニークにする必要があります。
カーソルが複合文内で宣言される場合、(Watcom-SQL または Transact-SQL 複合文での宣言にかかわらず) その複合文の間だけ存在します。
なし
なし
SQL/2003 コア機能。
次の例は、Embedded SQL 内のスクロール・カーソルを宣言する方法を示します。
EXEC SQL DECLARE cur_employee SCROLL CURSOR FOR SELECT * FROM Employees; |
次の例は、Embedded SQL 内の準備文のためのカーソルを宣言する方法を示します。
EXEC SQL PREPARE employee_statement FROM 'SELECT Surname FROM Employees'; EXEC SQL DECLARE cur_employee CURSOR FOR employee_statement; |
次の例は、ストアド・プロシージャのカーソルの使用方法を示します。
BEGIN DECLARE cur_employee CURSOR FOR SELECT Surname FROM Employees; DECLARE name CHAR(40); OPEN cur_employee; lp: LOOP FETCH NEXT cur_employee INTO name; IF SQLCODE <> 0 THEN LEAVE lp END IF; ... END LOOP; CLOSE cur_employee; END |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |