カーソルを宣言します。
DECLARE cursor-name [ UNIQUE ] [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR FOR { select-statement | statement-name | call-statement }
DECLARE cursor-name [ NO SCROLL | DYNAMIC SCROLL | SCROLL | INSENSITIVE | SENSITIVE ] CURSOR { FOR select-statement | FOR call-statement | USING variable-name }
cursor-name : identifier
statement-name : identifier | hostvar
variable-name : identifier
UNIQUE 句 カーソルが UNIQUE として宣言されている場合、クエリは各ローをユニークに識別するのに必要なすべてのカラムを強制的に返します。このため、プライマリキーまたはユニークなテーブル制約内のカラムのすべてが、確実に返ることになります。必須であってもクエリに指定されていなかったカラムは、結果セットに追加されます。
UNIQUE カーソル上で実行された DESCRIBE は、インジケーター変数の中に次の追加のオプションを設定します。
DT_KEY_COLUMN カラムはローに対するキーの一部です。
DT_HIDDEN_COLUMN カラムがクエリに追加されました。カラムはローをユニークに識別するために必要です。
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 カーソルを提供します。value-sensitive カーソルを使用すると、基本となるローが変更または削除されている場合に、以前に FETCH された結果ローの後に続く FETCH に対して、警告またはエラーが返されることがあります。
SQL Anywhere は、結果セットのメンバーシップが保証されるような方法で value-sensitive カーソルを実行します。DYNAMIC SCROLL カーソルの方が効率的です。SCROLL カーソルの一貫した動作が必要でない場合は、DYNAMIC SCROLL カーソルを使用してください。
INSENSITIVE 句 INSENSITIVE として宣言されたカーソルには、それを開いたときに決定されるメンバーシップがあります。テンポラリテーブルは、すべてのオリジナルローのコピーから作成されます。INSENSITIVE カーソルからの FETCH では、同時に実行されているトランザクションの別の INSERT、UPDATE、または DELETE 文、および同じトランザクション内からの別の更新操作の影響を受けません。INSENSITIVE カーソルは更新できません。
SENSITIVE 句 SENSITIVE として宣言されたカーソルは、結果セットのメンバーシップまたは値の変更に依存します。
statement-name 句の場合 PREPARE 文を使用して文に名前を付けます。作成された SELECT または CALL のためにだけカーソルを宣言できます。SQL プリプロセッサーの -m HISTORICAL オプションが指定されている場合を除き、PREPARE 文に指定されているカーソル更新可能性がカーソルに使用されます。
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; CLOSE crsr; 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; |
カーソルはクエリの結果を操作する主要な手段です。DECLARE CURSOR 文は、SELECT 文または CALL 文に対して指定された名前を持つカーソルを宣言します。Watcom SQL のプロシージャー、トリガー、またはバッチの場合、DECLARE CURSOR 文は、BEGIN キーワードの直後に、他の宣言とともに指定してください。カーソル名はユニークにしてください。
カーソルが複合文内で宣言される場合、(Watcom SQL または Transact-SQL 複合文のいずれで宣言されていても) その複合文を実行している間のみ存在します。
DECLARE CURSOR 文で指定したカーソルのタイプで、その文のクエリオプティマイザーによって選択される実行プランを決定できます。たとえば、SELECT 文の INSENSITIVE カーソルは、カーソルを開いたときに SELECT 文の結果セットが完全に実体化されることを要求します。また、カーソルのタイプは基本となる文の特性と一致している必要があります。カーソルタイプと文に不一致があった場合、カーソルタイプが自動的に変更されることがあります。たとえば、定義上 INSENSITIVE カーソルは読み込み専用のため、INSENSITIVE カーソル宣言は FOR UPDATE を指定している更新可能な SELECT 文とは競合します。このような場合、カーソルタイプは、カーソルが開かれたときに自動的に INSENSITIVE から更新可能な value-sensitive カーソルに変更されます。
カーソル宣言に組み込まれている SELECT 文の更新可能性は、指定されていない場合 ansi_update_constraints オプションの設定によって決定されます。
なし
基本となる文の要件を満たすようにカーソルタイプを変更する必要がある場合、カーソルが開かれたときに警告が返されます。
SQL/2008 DECLARE CURSOR は、SQL/2008 標準のコア機能です。FOR UPDATE に SCROLL または NO SCROLL を付けて指定する機能は、オプションの SQL 言語機能 F831、"Full cursor update" です。Embedded SQL プログラムでの DECLARE CURSOR の使用は、オプションの SQL 言語機能 B031 によって構成されています。いくつかのカーソルタイプもオプションの SQL 機能です。これらのコードを以下に示します。
INSENSITIVE カーソルは、SQL/2008 標準のオプションの SQL 言語機能 F791 です。
SENSITIVE カーソルは、SQL/2008 標準のオプションの SQL 言語機能 F231 です。
スクロール可能カーソルは、SQL/2008 標準のオプションの SQL 言語機能 F431 です。
SQL Anywhere では、以下のような DECLARE CURSOR の多くのベンダー拡張がサポートされます。
SQL Anywhere では、SQL/2008 において DECLARE CURSOR 文の句として定義されている FOR UPDATE 句の複数の拡張がサポートされます。
WITH HOLD は、SQL/2008 の定義に従った DECLARE CURSOR 文の句としてではなく、OPEN 文の句として指定されます。
SQL/2008 標準では、カーソルの感知性とスクロール動作の概念を区別していますが、SQL Anywhere では、歴史的な理由から、この 2 つを組み合わせています。SQL Anywhere では、NO SCROLL として宣言されているカーソルを除き、すべてのカーソルは前後にスクロール可能です。
DYNAMIC SCROLL と UNIQUE はベンダー拡張です。DYNAMIC SCROLL は、SQL/2008 標準の ASENSITIVE として宣言されるカーソルと似た動作をします。
CALL 文を介して、または USING 句を使用してカーソルを宣言する機能は、ベンダー拡張です。
Transact-SQL DECLARE CURSOR は、Adaptive Server Enterprise によってサポートされますが、いくつかの動作が異なります。Adaptive Server Enterprise は、SQL/2008 と同様に、スクロール動作と感知性を区別します。Adaptive Server Enterprise では、カーソル感知性オプションは SEMI-SENSITIVE、INSENSITIVE、またはデフォルト (ASENSITIVE と類似) です。Adaptive Server Enterprise では、NO SCROLL カーソルがデフォルトであり、スクロール可能なカーソルはすべて読み込み専用です。DECLARE CURSOR 文のいくつかの機能は、Adaptive Server Enterprise ではサポートされません。これらのコードを以下に示します。
Adaptive Server Enterprise では、SQL Anywhere のカーソル同時実行性句はサポートされません。
フェッチされるローに対するロックを取得するには、HOLDLOCK テーブルヒントを使用してください。
Adaptive Server Enterprise は、DYNAMIC SCROLL カーソルおよび UNIQUE カーソルをサポートしません。DYNAMIC SCROLL は、Adaptive Server Enterprise のデフォルトカーソルの動作と似ています。
CALL 文を介して、または USING 句を使用してカーソルを宣言する機能は、Adaptive Server Enterprise ではサポートされません。
Adaptive Server Enterprise では、Transact-SQL プロシージャーとフャンクションに対して、同じカーソル名を使用する複数の DECLARE CURSOR 文を指定できます。Adaptive Server Enterprise では、DEALLOCATE CURSOR 文は、後続の OPEN 文が以前宣言された正しいカーソルを参照できるように、現在のスコープからカーソルを削除するために使用されます。この機能は SQL Anywhere ではサポートされていません。SQL Anywhere では、指定されたスコープ内のすべてのカーソルは、ユニークな名前を持つ必要があります。Transact-SQL ダイアレクトのプロシージャーに同じ名前の複数のカーソル宣言が含まれている場合、プロシージャーが解析されるとき、エラーは発生しません。ただし、実行時に、同じカーソル名の 2 つ目の DECLARE CURSOR 文が実行されると、エラーが発生します。
Open Client 接続および jConnect 接続の TDS Wire Protocol は、完全にスクロール可能な結果セットを実装しないことに注意してください。カーソルで後方にスクロールするときに、TDS クライアントによってすでに取り出されている、プリフェッチされたローのウィンドウ内に必要なローがある場合、FETCH 要求はすぐに履行される可能性があります。ただし、必要なローがこのウィンドウの外にある場合、カーソルの SELECT 文が再実行されることがあります。
次の例は、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'FOR READ ONLY; 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 |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |