この文は、事前に宣言されたカーソルを開き、データベースからの情報にアクセスするために使用します。
OPEN cursor-name [ USING { DESCRIPTOR sqlda-name | hostvar, ... } ] [ WITH HOLD ] [ ISOLATION LEVEL n ] [ BLOCK n ]
cursor-name : identifier または hostvar
sqlda-name : identifier
USING DESCRIPTOR 句 USING DESCRIPTOR 句を使用できるのは、Embedded SQL のみです。この句は、カーソルが宣言されている SELECT 文のプレースホルダ・バインド変数にバインドされるホスト変数を指定します。
WITH HOLD 句 デフォルトで、すべてのカーソルは現在のトランザクションの最後 (COMMIT または ROLLBACK) で自動的に閉じられます。オプションの WITH HOLD 句は、次に実行されるトランザクションのためにカーソルを開いたままにします。カーソルは現在の接続が終了するまで、または明示的な CLOSE 文が実行されるまで開いたままです。接続が終了すると、カーソルは自動的に閉じます。
ISOLATION LEVEL 句 ISOLATION LEVEL 句を使用すると、isolation_level オプションの現在の設定とは異なる独立性レベルでカーソルを開くことができます。このカーソルのすべてのオペレーションを、オプション設定とは関係なく、指定した独立性レベルで実行できます。この句を指定しない場合、カーソルが開いている間のカーソルの独立性レベルは、カーソルを開いたときの isolation_level オプションの値です。ロックの仕組みを参照してください。
次の値がサポートされます。
カーソルは、最初のローの前に置かれます (ESQL でのカーソルの使用またはプロシージャとトリガでのカーソルの使用を参照してください)。
BLOCK 句 この句は、Embedded SQL でのみ使用されます。クライアント・アプリケーションは一度に複数のローをフェッチできます。これはブロック・フェッチ、プリフェッチ、またはマルチロー・フェッチと呼ばれます。BLOCK 句を指定すると、プリフェッチされるローの数を減らすことができます。OPEN で BLOCK 句を指定することは、各 FETCH で BLOCK 句を指定することと同じです。FETCH 文 [ESQL] [SP]を参照してください。
OPEN 文は、指定したカーソルを開きます。カーソルを事前に宣言しておきます。
カーソルが CALL 文にあるとき、OPEN は最初の結果セット (INTO 句がない SELECT 文) が見つかるまでプロシージャを実行します。プロシージャが完了しても結果セットが見つからない場合は、SQLSTATE_PROCEDURE_COMPLETE 警告が設定されます。
「Embedded SQL の使用方法」:OPEN 文が正常に実行された後で、SQLCA (SQLIOESTIMATE) の sqlerrd[3] フィールドに、クエリのすべてのローをフェッチするのに必要な入出力操作の数の推定値が格納されます。同様に、SQLCA (SQLCOUNT) の sqlerrd[2] フィールドに、カーソル内にある実際のローの数 (0 以上の値)、またはその推定値 (絶対値が推定値である負の数) が入ります。データベース・サーバによって計算されたローの数は、ローの実際の数です。ローを数える必要はありません。ローの実際の数を常に返すようにデータベースを設定することもできますが (row_counts オプション [データベース]を参照してください)、これはおすすめしません。cursor-name が識別子または文字列によって指定される場合、C プログラムでは OPEN の前に対応する DECLARE CURSOR 文を置きます。ホスト変数によって cursor-name を指定する場合、DECLARE CURSOR 文を OPEN 文の前で実行します。
SELECT 文のすべてのテーブルに SELECT パーミッション、または CALL 文のプロシージャに EXECUTE パーミッションが必要です。
なし
SQL/2003 ESQL の使用はコア機能です。プロシージャの使用は、永続的ストアド・モジュール機能です。
次の例は、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 |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |