事前に宣言したカーソルを開き、データベースの情報にアクセスします。
OPEN cursor-name [ USING { DESCRIPTOR sqlda-name | hostvar, ... } ] [ WITH HOLD ] [ ISOLATION LEVEL isolation-level ] [ BLOCK n ]
OPEN cursor-name [ WITH HOLD ] [ ISOLATION LEVEL isolation-level ]
cursor-name : identifier | hostvar
sqlda-name : identifier
isolation-level : 0 | 1 | 2 | 3 | SNAPSHOT | STATEMENT SNAPSHOT | READONLY STATEMENT SNAPSHOT
USING DESCRIPTOR 句 USING DESCRIPTOR 句を使用できるのは、Embedded SQL のみです。この句は、カーソルが宣言されている SELECT 文のプレースホルダーバインド変数にバインドされるホスト変数を指定します。
OPEN...USING はストアドプロシージャーでは使用できません。
WITH HOLD 句 デフォルトで、すべてのカーソルは現在のトランザクションの最後 (COMMIT または ROLLBACK) で自動的に閉じられます。オプションの WITH HOLD 句は、次に実行されるトランザクションのためにカーソルを開いたままにします。カーソルは現在の接続が終了するまで、または明示的な CLOSE 文が実行されるまで開いたままです。接続が終了すると、カーソルは自動的に閉じます。
COMMIT または ROLLBACK を実行すると、WITH HOLD カーソルの結果セットを構成するローを含め、接続で保持されている長期間のローロックがすべて解放されます。ただし、独立性レベル 1、2、3 で取得されたカーソル安定性ロックは、カーソルが存在するかぎり保持され、カーソルが閉じられるか、または接続が終了したときにのみ解放されます。
ROLLBACK 文が完了すると、WITH HOLD カーソルの内容とその範囲内での位置付けは予測できなくなり、保証されなくなります。ansi_close_cursors_on_rollback オプションを使用して、ROLLBACK 文によって WITH HOLD カーソルを自動的に閉じるかどうかを制御できます。
ISOLATION LEVEL 句 ISOLATION LEVEL 句を使用すると、isolation_level オプションの現在の設定とは異なる独立性レベルでカーソルを開くことができます。このカーソルのすべてのオペレーションを、オプション設定とは関係なく、指定した独立性レベルで実行できます。この句を指定しない場合、カーソルが開いている間のカーソルの独立性レベルは、カーソルを開いたときの isolation_level オプションの値です。
次の値がサポートされます。
カーソルは、最初のローの前に置かれます。
BLOCK 句 この句は、Embedded SQL でのみ使用されます。クライアントアプリケーションは一度に複数のローをフェッチできます。これはブロックフェッチ、プリフェッチ、またはマルチローフェッチと呼ばれます。BLOCK 句を指定すると、プリフェッチされるローの数を減らすことができます。OPEN で BLOCK 句を指定することは、各 FETCH で BLOCK 句を指定することと同じです。
OPEN 文は、指定したカーソルを開きます。カーソルを事前に宣言しておきます。
カーソルタイプが、カーソルの基本となる文の特性と一致していない場合、OPEN 文によって SQL 警告が返されることがあります。
カーソルが CALL 文にあるとき、OPEN は最初の結果セット (INTO 句がない SELECT 文) が見つかるまでプロシージャーを実行します。プロシージャーが完了しても結果セットが見つからない場合は、SQLSTATE_PROCEDURE_COMPLETE 警告が設定されます。
ESQL の使用方法 OPEN 文が正常に実行された後で、SQLCA (SQLIOESTIMATE) の sqlerrd[3] フィールドに、クエリのすべてのローをフェッチするのに必要な入出力操作の数の推定値が格納されます。同様に、SQLCA (SQLCOUNT) の sqlerrd[2] フィールドに、カーソル内にある実際のローの数 (0 以上の値)、またはその推定値 (絶対値が推定値である負の数) が入ります。データベースサーバーによって計算されたローの数は、ローの実際の数です。ローを数える必要はありません。ローの実際の数を常に返すようにデータベースを設定することもできますが、これはおすすめしません。
cursor-name を識別子または文字列によって指定する場合、C プログラムでは OPEN の前に対応する DECLARE CURSOR 文を置きます。cursor-name をホスト変数によって指定する場合、DECLARE CURSOR 文を OPEN 文の前で実行します。
SELECT 文のすべてのテーブルに SELECT パーミッション、または CALL 文のプロシージャーに EXECUTE パーミッションが必要です。
OPEN 文を実行すると、INSENSITIVE カーソルの結果セットが完全に実体化されます。
アクセスプランのキャッシュが有効になっている場合、OPEN 時にアプリケーションに返される SQL 警告が抑制されることがあります。抑制される警告には、カーソルタイプが変更されたこと、基本となるクエリが決定的でないこと、または文に埋め込まれている複数のリテラル定数で文字列のトランケーションが発生していることを示す警告があります。
SQL/2008 Embedded SQL 内での OPEN 文の使用は、オプションの SQL 言語機能 B031、"Basic dynamic SQL" の一部です。ストアドプロシージャー内での OPEN 文の使用は、SQL/2008 のコア機能です。ISOLATION LEVEL 句と BLOCK 句は、CALL 文でのカーソルの OPEN 機能と同様に、ベンダー拡張です。SQL/2008 標準では、WITH HOLD は、DECLARE CURSOR 文の一部として指定し、OPEN では指定しません。
SQLCA の特定の値の設定はベンダー拡張です。
Transact-SQL OPEN 文は Adaptive Server Enterprise でサポートされています。Adaptive Server Enterprise では、ISOLATION LEVEL 句、BLOCK 句、WITH HOLD 句はサポートされていません。
次の例は、Embedded SQL での OPEN の使用を示します。
EXEC SQL OPEN employee_cursor; |
と
EXEC SQL PREPARE emp_stat FROM 'SELECT empnum, empname FROM Employees WHERE name like ?'; EXEC SQL DECLARE employee_cursor CURSOR FOR emp_stat; EXEC SQL OPEN employee_cursor USING :pattern; |
次の例はプロシージャーまたはトリガーからのものです。
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 |