DECLARE (SQL)
構文
DECLARE cursor-name CURSOR FOR query
概要
DECLARE 文は、カーソル・ベース埋め込み SQL で使用するカーソルを宣言します。カーソルを宣言した後、OPEN 文を発行してカーソルを開いてから、一連の FETCH 文を発行して個別のレコードを取得します。このカーソルは、これらの FETCH 文によって取得するレコードの選択に使用する SELECT クエリを定義します。CLOSE 文を発行してカーソルを閉じます (ただし削除はしません)。
SQL 文として、DECLARE は埋め込み SQL からのみサポートされます。ダイナミック SQL の場合は、代わりに単純な SELECT 文 (INTO 節のないもの) を使用するか、ダイナミック SQL と埋め込み SQL の組み合わせを使用します。同様の操作は、ODBC でも ODBC API を使用してサポートされます。
DECLARE は前方向のみ (スクロールできない) カーソルを宣言します。フェッチ操作は、クエリの結果セットの最初のレコードから始まり、結果セットのレコードを順次処理します。FETCH はレコードを 1 回しかフェッチできません。次の FETCH では、結果セットの次のレコードが順次フェッチされます。
DECLARE は宣言であり実行文ではないため、SQLCODE 変数を設定したり削除したりすることはできません。
カーソル名
カーソル名は、大文字と小文字を区別します。
カーソル名は、ルーチンおよびその対応するクラス内で一意である必要があります。カーソル名の長さに制限はなく、最初の 29 文字は一意である必要があります。カーソル名は、大文字と小文字を区別します。指定したカーソルが既に宣言されている場合、コンパイル・エラーは発行されません。SQL の実行時には、そのカーソルのうち最後に宣言されたインスタンスが使用されます。
カーソル名はネームスペース固有ではありません。あるネームスペースでカーソルを DECLARE でき、別のネームスペースからこのカーソルを OPEN、FETCH、または CLOSE できます。埋め込み SQL のコンパイルは OPEN コマンドの実行時に行われます。SQL テーブルとローカル変数はネームスペース固有であるため、OPEN 操作は、クエリで指定されたテーブルが配置されているネームスペースと同じネームスペースで呼び出す必要があります (またはそのネームスペース内のテーブルにアクセスできる必要があります)。
カーソル名の最初には文字を指定する必要があります。カーソル名の 2 文字目以降には、文字または数字のいずれかを指定する必要があります。SQL 識別子 とは異なり、カーソル名に句読点文字を使用することはできません。
カーソル名に SQL 予約語を指定するには、区切り文字 (二重引用符) を使用できます。区切られたカーソル名は、SQL 区切り識別子ではありません。区切られたカーソル名でも大文字と小文字が区別され、句読点文字を含むことはできません。多くの場合、SQL 予約語はカーソル名として使用するべきではありません。
カーソルを使用した更新
WHERE CURRENT OF 節を指定して UPDATE 文または DELETE 文を使用することによって、宣言したカーソルを使用してレコードの更新と削除を実行できます。InterSystems SQL では、対象のテーブルおよび列に対する適切な特権がある場合には、UPDATE 操作または DELETE 操作に常にカーソルを使用できます。オブジェクト特権の割り当ての詳細は、GRANT 文を参照してください。
DECLARE 文では、クエリの次に FOR UPDATE キーワード節または FOR READ ONLY キーワード節を指定できます。これらの節はオプションで、操作は何も実行されません。これらは、クエリを発行するプロセスが必要な更新および削除のオブジェクト特権を持っているまたは持っていないことをコードに記述する方法として提供されています。
引数
cursor-name
カーソル名。文字で開始し、文字および数字のみを使用する必要があります (カーソル名は SQL 識別子の規約に従いません)。カーソル名は、大文字と小文字を区別します。以下のように追加の名前付け制約に従います。
query
カーソルの結果セットを定義する標準 SELECT 文。この SELECT には %NOFPLAN キーワードを含めることで、InterSystems IRIS がこのクエリの凍結プラン (ある場合) を無視するように指定できます。この SELECT で指定する ORDER BY 節には、TOP 節を記述しても記述しなくてもかまいません。この SELECT は、FROM 節にテーブル値関数を指定できます。
例
以下の埋め込み SQL の例では、DECLARE を使用して、2 つの出力ホスト変数を指定するクエリのカーソルを定義しています。その後、カーソルはオープンされて、繰り返しフェッチされ、クローズされます。
SET name="John Doe",state="##"
&sql(DECLARE EmpCursor CURSOR FOR
SELECT Name, Home_State
INTO :name,:state FROM Sample.Person
WHERE Home_State %STARTSWITH 'A'
FOR READ ONLY)
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 !,"FETCH status SQLCODE=",SQLCODE
WRITE !,"Number of rows fetched=",%ROWCOUNT
&sql(CLOSE EmpCursor)
IF SQLCODE<0 {WRITE "SQL Close Cursor Error:",SQLCODE," ",%msg QUIT}
WRITE !,"AFTER: Name=",name," State=",state
以下の埋め込み SQL の例では、DECLARE を使用して、INTO 節の出力ホスト変数と WHERE 節の入力ホスト変数の両方を指定するクエリのカーソルを定義しています。その後、カーソルはオープンされて、繰り返しフェッチされ、クローズされます。
NEW SQLCODE,%ROWCOUNT,%ROWID
SET EmpZipLow="10000"
SET EmpZipHigh="19999"
&sql(DECLARE EmpCursor CURSOR FOR
SELECT Name,Home_Zip
INTO :name,:zip
FROM Sample.Employee WHERE Home_Zip BETWEEN :EmpZipLow AND :EmpZipHigh)
&sql(OPEN EmpCursor)
IF SQLCODE<0 {WRITE "SQL Open Cursor Error:",SQLCODE," ",%msg QUIT}
FOR { &sql(FETCH EmpCursor)
QUIT:SQLCODE
WRITE !,name," ",zip }
&sql(CLOSE EmpCursor)
IF SQLCODE<0 {WRITE "SQL Close Cursor Error:",SQLCODE," ",%msg QUIT}
以下の埋め込み SQL の例では、テーブル値関数を query の FROM 節として使用しています。
SET $NAMESPACE="Samples"
&sql(DECLARE EmpCursor CURSOR FOR
SELECT Name INTO :name FROM Sample.SP_Sample_By_Name('A')
FOR READ ONLY)
&sql(OPEN EmpCursor)
IF SQLCODE<0 {WRITE "SQL Open Cursor Error:",SQLCODE," ",%msg QUIT}
NEW %ROWCOUNT,%ROWID
FOR { &sql(FETCH EmpCursor)
QUIT:SQLCODE
WRITE "Name=",name,! }
WRITE !,"FETCH status SQLCODE=",SQLCODE
WRITE !,"Number of rows fetched=",%ROWCOUNT
&sql(CLOSE EmpCursor)
IF SQLCODE<0 {WRITE "SQL Close Cursor Error:",SQLCODE," ",%msg QUIT}