CLOSE ステートメント

CLOSE ステートメントは、カーソルをクローズします。 カーソルのオープン時に結果表が作成された場合、その表は破棄されます。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 これは、動的に作成できない実行可能ステートメントです。 コマンド行プロセッサーを使用して呼び出した場合は、一部のオプションを指定できません。 詳しくは、コマンド行 SQL ステートメントおよび XQuery ステートメントの使用を参照してください。

許可

cursor-variable-name がグローバル変数が参照する場合、ステートメントの許可 ID に、以下のいずれかの権限が含まれている必要があります。
  • モジュールで定義されていないグローバル変数に対する READ 特権
  • モジュールで定義されているグローバル変数のモジュールに対する EXECUTE 特権
  • モジュールで定義されているグローバル変数のモジュールが含まれているスキーマに対する EXECUTEIN 特権
  • モジュールで定義されているグローバル変数のモジュールが含まれているスキーマに対する DATAACCESS 権限
カーソルの使用に必要な許可については、 DECLARE CURSOR を参照してください。

構文

Read syntax diagramSkip visual syntax diagramCLOSE cursor-namecursor-variable-name WITH RELEASE

説明

cursor-name
クローズするカーソルを識別します。 DECLARE CURSOR ステートメントの項で説明されているように、 cursor-name は、宣言されたカーソルを指定しなければなりません。 CLOSE ステートメントを実行する場合、カーソルはオープン状態でなければなりません。
カーソル変数名 (cursor-variable-name)
クローズするカーソルを識別します。 cursor-variable-name は、カーソル変数を識別する必要があります。 CLOSE ステートメントが実行される時点で、cursor-variable-name の基礎となっているカーソルは、オープン状態でなければなりません (SQLSTATE 24501)。 cursor-variable-name を使用する CLOSE ステートメントは、コンパウンド SQL (コンパイル済み) ステートメント内でのみ使用できます。
WITH RELEASE
カーソルのために保留されていた、すべてのロックを解放しようとします。 すべてのロックを解放する必要はないことに注意してください。 これらのロックは他の操作または活動のために保留することができます。

  • 作業単位の終了時には、アプリケーション・プロセスに属し、 WITH HOLD オプションを指定せずに宣言されたすべてのカーソルは暗黙にクローズされます。
  • カーソル変数の基礎となるカーソルは、孤立カーソルになると暗黙のうちにクローズされます。 基礎となるカーソルは、いずれかのカーソル変数の基礎となるカーソルでなくなると、孤立カーソルになります。 例えば、基礎となるカーソルに対するカーソル変数のすべてが同じスコープ中にあって、そのすべてが同時にスコープから外れる場合などに、このようなことが起きます。
  • WITH RELEASE 節は、関数またはメソッドで定義されたカーソルのクローズには効力を持っていません。 またこの節は、関数またはメソッドから呼び出されるプロシージャーで定義されたカーソルのクローズに対しても効力を持ちません。
  • WITH RELEASE 節は、分離レベル CS または UR で機能しているカーソルに対しては影響を与えません。 また、分離レベル RS または RR で機能しているカーソルに対して WITH RELEASE を指定した場合には、 それらの分離レベルの保証の一部が終了させられます。 特に、カーソルを再オープンする場合には、RS カーソルが '反復不可読み取り' 状態になったり、 RR カーソルが '反復不可読み取り' か '幻像読み取り' 状態のどちらかになる可能性があります。

    もともと RR か RS だったカーソルが、WITH RELEASE 節を使用してクローズされたのちに、 再オープンされると、新しいロックを獲得できます。

  • クローズされずに呼び出し側プログラムに戻ったプロシージャー内のカーソルには、特殊な規則が適用されます。
  • カーソルがオープンしている間は (つまり、まだクローズしていない場合)、 そのカーソルをステートメントが呼び出した結果 (例えば、 NEXT VALUE 式が組み込まれたカーソルをシーケンスに使用した FETCH または UPDATE) 生じたシーケンス値への変更が、 そのカーソルが示したシーケンスを PREVIOUS VALUE に更新することはありません。 このように影響を受けるシーケンスの PREVIOUS VALUE 値は、 CLOSE ステートメントを使ってカーソルを明示的にクローズした際に更新されます。 パーティション・データベース環境では、 コミットやロールバックによってカーソルを暗黙的にクローズした場合、 PREVIOUS VALUE はシーケンスについて生成された最新の値に更新されない場合があります。

カーソルを使用して、C プログラム変数 dnumdname、および mnum の中に、一度に 1 行ずつ取り出します。 最後にカーソルをクローズします。 再びカーソルをオープンすると、再びその位置は取り出される行の始めになります。
   EXEC SQL DECLARE C1 CURSOR FOR
     SELECT DEPTNO, DEPTNAME, MGRNO
     FROM TDEPT
     WHERE ADMRDEPT = 'A00';

   EXEC SQL OPEN C1;

   while (SQLCODE==0) {                                             .
     EXEC SQL FETCH C1 INTO :dnum, :dname, :mnum;
        .
        .
   }
   EXEC SQL CLOSE C1;