Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

CLOSE (SQL)

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

Synopsis

CLOSE cursor-name

引数

cursor-name クローズするカーソルの名前。カーソル名は DECLARE 文で指定されています。カーソル名は、大文字と小文字を区別します。

概要

CLOSE 文は、オープンしているカーソルをクローズします。これは現在の結果セットをリリースし、現在カーソルがある行によって設定されたカーソル・ロックを解放します。ただし、CLOSE はカーソルを削除しません。再度オープンするときのためにデータ構造をアクセス可能なままにしますが、カーソルを再度オープンするまで、フェッチや位置付け更新はできません。この動作は以下のコマンド・シーケンスによって示されます。

  • DECLARE c1OPEN c1FETCH c1CLOSE c1 は標準シーケンスです。

  • DECLARE c1OPEN c1CLOSE c1OPEN c1 は、宣言されたカーソル c1 を再度オープンします。

  • DECLARE c1OPEN c1CLOSE c1DECLARE c1OPEN c1 は、最初の DECLARE で指定されたカーソルを再度オープンし、2 番目の DECLARE は無視します。

  • DECLARE c1OPEN c1FETCH c1CLOSE c1OPEN c1FETCH c1 は、両方のフェッチ操作を行って、同じレコードを取得します。

CLOSE は、オープンされたカーソルで発行する必要があります。宣言されただけの (オープンされていない) カーソルや、既にクローズされたカーソルで CLOSE を発行すると、SQLCODE -102 エラーが発生します。存在しないカーソル (定義されたカーソルと大文字/小文字が違うカーソルなど) で CLOSE を発行すると、SQLCODE -52 エラーが発生します。

cursor-name はネームスペース固有ではありません。現在のネームスペースを変更しても、宣言されたカーソルの使用には影響はありません。ネームスペースで考慮する必要がある唯一の点は、FETCH は、クエリ対象のテーブルを含むネームスペースで行う必要があるということです。

SQL 文では、CLOSE は埋め込み SQL でのみサポートされることに注意してください。同様の操作は、ODBC でも ODBC API を使用してサポートされます。

以下は、EmpCursor という名前のカーソルをオープンしてクローズする埋め込み SQL の例です。

   SET name="LastName,FirstName",state="##"
   &sql(DECLARE EmpCursor CURSOR FOR 
        SELECT Name, Home_State
        INTO :name,:state FROM Sample.Employee
        WHERE Home_State %STARTSWITH 'A')
   WRITE !,"BEFORE: Name=",name," State=",state 
   &sql(OPEN EmpCursor)
     IF SQLCODE<0 {WRITE "SQL Open Cursor Error:",SQLCODE," ",%msg  QUIT}
   NEW %ROWCOUNT,%ROWID
   FOR { &sql(FETCH EmpCursor)
        QUIT:SQLCODE  
        WRITE !,"DURING: Name=",name," State=",state }
   WRITE !,"After FETCH SQLCODE: ",SQLCODE
   WRITE !,"After FETCH row count: ",%ROWCOUNT
   &sql(CLOSE EmpCursor)
      IF SQLCODE<0 {WRITE "SQL Close Cursor Error:",SQLCODE," ",%msg  QUIT} 
   WRITE !,"After CLOSE SQLCODE: ",SQLCODE
   WRITE !,"After CLOSE row count: ",%ROWCOUNT
   WRITE !,"AFTER: Name=",name," State=",state

カーソルをクローズした後も、ホスト変数には最後にフェッチしたデータ値が設定されたままになっており、%ROWCOUNT には取得した行数が設定されたまま残っている点に注意してください。ただし、フェッチ終了時の SQLCODE の値 (SQLCODE=100) は、CLOSE の SQLCODE の値 (SQLCODE=0) で上書きされます。

以下の埋め込み SQL の例は、複数ネームスペース間でカーソルが持続することを示しています。このカーソルは %SYS で宣言され、USER でオープンおよびフェッチされ、SAMPLES でクローズされます。OPEN は、クエリされるテーブルを含むネームスペースで実行する必要があること、および FETCH は出力ホスト変数にアクセスできる必要があり、出力ホスト変数はネームスペース固有であることに注意してください。

    &sql(USE DATABASE %SYS)
    WRITE $ZNSPACE,!
  &sql(DECLARE NSCursor CURSOR FOR SELECT Name INTO :name FROM Sample.Employee)
    &sql(USE DATABASE "USER")
    WRITE $ZNSPACE,!
  &sql(OPEN NSCursor)
        IF SQLCODE<0 {WRITE "SQL Open Cursor Error:",SQLCODE," ",%msg  QUIT}
       NEW SQLCODE,%ROWCOUNT,%ROWID
  FOR { &sql(FETCH NSCursor)
       QUIT:SQLCODE  
       WRITE "Name=",name,! }
    &sql(USE DATABASE SAMPLES)
    WRITE $ZNSPACE,!
  &sql(CLOSE NSCursor)
     IF SQLCODE<0 {WRITE "SQL Close Cursor Error:",SQLCODE," ",%msg  QUIT}

関連項目

FeedbackOpens in a new tab