Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

CLOSE

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

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 を発行すると、<SYNTAX> エラーが発生します。

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

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

CLOSE では、#SQLCompile Mode=Deferred プリプロセッサ指示文はサポートされていません。Deferred モードを DECLAREOPENFETCH、または CLOSE カーソル文で使用しようとすると、#5663 コンパイル・エラーが生成されます。

以下は、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)
   NEW SQLCODE,%ROWCOUNT,%ROWID
   FOR { &sql(FETCH EmpCursor)
        QUIT:SQLCODE  
        WRITE !,"DURING: Name=",name," State=",state }
   WRITE !,"After FETCH error code: ",SQLCODE
   WRITE !,"After FETCH row count: ",%ROWCOUNT
   &sql(CLOSE EmpCursor)
   WRITE !,"After CLOSE error code: ",SQLCODE
   WRITE !,"After CLOSE row count: ",%ROWCOUNT
   WRITE !,"AFTER: Name=",name," State=",state

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

以下の埋め込み SQL の例は、複数ネームスペース間でカーソルが持続することを示しています。このカーソルは SAMPLES で宣言され、DOCBOOK でオープンされ、SAMPLES でフェッチされ、USER でクローズされます。FETCH は、Sample.Employee を含むネームスペースで実行する必要があることに注意してください。

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

関連項目

FeedbackOpens in a new tab