CLOSE

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

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んで使用します。それ以外の使用法はありません。 これは実行可能ステートメントですが、動的に準備することはできません。Java™ では指定できません。

権限

権限は不要です。 カーソルの使用に必要な権限については、DECLARE CURSORを参照してください。

構文

構文図を読む構文図をスキップする
>>-CLOSE--cursor-name------------------------------------------><

説明

cursor-name
クローズするカーソルを識別します。DECLARE CURSOR ステートメントの項で説明されているように、 cursor-name は、宣言されたカーソルを指定しなければなりません。 CLOSE ステートメントは、オープン状態にあるカーソルに対して実行しなければなりません。

暗黙的なカーソル・クローズ: 以下の時点では、 プログラム内のすべてのカーソルはクローズ状態にあります。

  • プログラムが呼び出されたとき。
    • CLOSQLCSR(*ENDPGM) が指定されている場合、プログラムが呼び出されるたびに、すべてのカーソルがクローズ状態になります。
    • CLOSQLCSR(*ENDSQL) が指定されている場合、1 つの SQL プログラムが呼び出しスタックに残っている間は、プログラムが初めて呼び出されるときに限って、すべてのカーソルがクローズ状態になります。
    • CLOSQLCSR(*ENDJOB) が指定されている場合、ジョブ内でプログラムが最初に呼び出されたときに限って、すべてのカーソルがクローズ状態になります。
    • CLOSQLCSR(*ENDMOD) が指定されている場合、モジュールが開始されるたびに、すべてのカーソルがクローズ状態になります。
    • CLOSQLCSR(*ENDACTGRP) が指定されている場合、活動化グループ内で、プログラム中のモジュールが最初に開始されたときに、すべてのカーソルがクローズ状態になります。
  • HOLD オプションの指定がない COMMIT または ROLLBACK ステートメントを実行して、プログラムから新規の作業単位を開始したとき。 HOLD オプションを指定して宣言されたカーソルは、COMMIT ステートメントではクローズされません。
注: DB2® for i データベース・マネージャーは、照会をインプリメントするためにファイルをオープンします。 このファイルのクローズは、SQL CLOSE ステートメントとは 別に行うことができます。 詳しくは、「SQL プログラミング」を参照してください。

パフォーマンスのためのカーソルのクローズ: カーソルを、 できるだけ早い時機に明示的にクローズすることによって、パフォーマンスを向上させることができます。

プロシージャーに関する考慮事項: クローズされずに呼び出し側プログラムに戻ったプロシージャー内のカーソルには、 特殊な規則が適用されます。 詳しくは、CALLを参照してください。

COBOL プログラムでカーソル C1 を使用し、EMPPROJACT 表の最初の 4 つの 列から一度に 1 行ずつ値を取り出して、その値を次のホスト変数に入れます。

  • EMP (CHAR(6))
  • PRJ (CHAR(6))
  • ACT (SMALLINT)
  • TIM (DECIMAL(5,2))

最後にカーソルをクローズします。

   EXEC SQL  BEGIN DECLARE SECTION  END-EXEC.
     77  EMP              PIC X(6).
     77  PRJ              PIC X(6).
     77  ACT              PIC S9(4) BINARY.
     77  TIM              PIC S9(3)V9(2) PACKED-DECIMAL.
   EXEC SQL  END DECLARE SECTION  END-EXEC.
   .
   .
   .

   EXEC SQL  DECLARE C1 CURSOR FOR
               SELECT EMPNO, PROJNO, ACTNO, EMPTIME
                 FROM EMPPROJACT                        END-EXEC.

   EXEC SQL  OPEN C1  END-EXEC.

   EXEC SQL  FETCH C1 INTO :EMP, :PRJ, :ACT, :TIM  END-EXEC.

   IF SQLSTATE = '02000'
     PERFORM DATA-NOT-FOUND
   ELSE
     PERFORM GET-REST-OF-ACTIVITY UNTIL SQLSTATE IS NOT EQUAL TO '00000'.

   EXEC SQL  CLOSE C1  END-EXEC.

   GET-REST-OF-ACTIVITY
   EXEC SQL  FETCH C1 INTO :EMP, :PRJ, :ACT, :TIM  END-EXEC.
   .
   .
   .