CLOSE (SQL)
構文
CLOSE cursor-name
概要
CLOSE 文は、オープンしているカーソルをクローズします。これは現在の結果セットをリリースし、現在カーソルがある行によって設定されたカーソル・ロックを解放します。ただし、CLOSE はカーソルを削除しません。再度オープンするときのためにデータ構造をアクセス可能なままにしますが、カーソルを再度オープンするまで、フェッチや位置付け更新はできません。この動作は以下のコマンド・シーケンスによって示されます。
-
DECLARE c1、OPEN c1、FETCH c1、CLOSE c1 は標準シーケンスです。
-
DECLARE c1、OPEN c1、CLOSE c1、OPEN c1 は、宣言されたカーソル c1 を再度オープンします。
-
DECLARE c1、OPEN c1、CLOSE c1、DECLARE c1、OPEN c1 は、最初の DECLARE で指定されたカーソルを再度オープンし、2 番目の DECLARE は無視します。
-
DECLARE c1、OPEN c1、FETCH c1、CLOSE c1、OPEN c1、FETCH c1 は、両方のフェッチ操作を行って、同じレコードを取得します。
CLOSE は、オープンされたカーソルで発行する必要があります。宣言されただけの (オープンされていない) カーソルや、既にクローズされたカーソルで CLOSE を発行すると、SQLCODE -102 エラーが発生します。存在しないカーソル (定義されたカーソルと大文字/小文字が違うカーソルなど) で CLOSE を発行すると、SQLCODE -52 エラーが発生します。
cursor-name はネームスペース固有ではありません。現在のネームスペースを変更しても、宣言されたカーソルの使用には影響はありません。ネームスペースで考慮する必要がある唯一の点は、FETCH は、クエリ対象のテーブルを含むネームスペースで行う必要があるということです。
SQL 文では、CLOSE は埋め込み SQL でのみサポートされることに注意してください。同様の操作は、ODBC でも ODBC API を使用してサポートされます。
引数
cursor-name
クローズするカーソルの名前。カーソル名は DECLARE 文で指定されています。カーソル名は、大文字と小文字を区別します。
例
以下は、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}