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)

 

OPEN 文 [ESQL] [SP]

この文は、事前に宣言されたカーソルを開き、データベースからの情報にアクセスするために使用します。

構文
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 オプションの値です。ロックの仕組みを参照してください。

    次の値がサポートされます。

    • 0
    • 1
    • 2
    • 3
    • snapshot
    • statement snapshot
    • readonly statement snapshot

    カーソルは、最初のローの前に置かれます (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