SQL 解説書
DECLARE CURSOR ステートメントは、カーソルを定義します。
呼び出し
対話式 SQL 機能には外見上対話式の実行に見えるインターフェースが用意されている場合がありますが、
このステートメントはアプリケーション・プログラムに組み込むことだけが可能です。
このステートメントは実行可能ステートメントではなく、動的に準備することはできません。
許可
"カーソルの SELECT ステートメント" という用語は、以下の許可規則を示すために使用されます。
カーソルの SELECT ステートメントは、次のいずれかです。
- statement-name (ステートメント名) によって識別され、
準備される選択ステートメント。
- 指定された select-statement (選択ステートメント)。
カーソルの SELECT ステートメントに指定する表または
視点のそれぞれについて、ステートメントの許可 ID の特権に、
以下の特権が少なくとも 1 つ含まれている必要があります。
- SYSADM または DBADM 権限。
- select-statement で指定された表または視点のそれぞれに対する以下のいずれかの特権。
- 表または視点に対する SELECT 特権、または
- 表または視点に対する CONTROL 特権。
statement-name を指定した場合:
- ステートメントの許可 ID は、実行時許可 ID になります。
- 許可検査は、選択ステートメントが準備される時点で行われます。
- 選択ステートメントの準備が成功しない限り、カーソルはオープンされません。
select-statement を指定した場合:
- GROUP 特権は検査されません。
- ステートメントの許可 ID は、プログラム作成時に指定される許可 ID になります。
構文
>>-DECLARE--cursor-name--CURSOR----+------------+--------------->
'-WITH HOLD--'
>-----+------------------------------+-------------------------->
| .-TO CALLER--. |
'-WITH RETURN--+------------+--'
'-TO CLIENT--'
>----FOR--+-select-statement-+---------------------------------><
'-statement-name---'
説明
- cursor-name
- ソース・プログラムの実行時に作成されるカーソルの名前を指定します。
この名前は、ソース・プログラムに宣言されている他のカーソルの名前と同じであってはなりません。
カーソルは、その使用に先立ってオープンする必要があります(OPEN を参照してください)。
- WITH HOLD
- 複数の作業単位を通して資源を維持します。
WITH HOLD カーソル属性の効果は次のとおりです。
- COMMIT で終了する作業単位の場合:
- ROLLBACK で終了する作業単位の場合:
- オープン・カーソルはすべてクローズされます。
- その作業単位の過程で獲得したロックはすべて解除されます。
- LOB ロケーターは解放されます。
- 特殊な COMMIT の場合:
- パッケージは、パッケージをバインドすることによって明示的に再作成されるか、
または無効になった後、
それが初めて参照されるときに動的に再作成されることにより暗黙のうちに再作成されます。
保留されたカーソルはすべて、パッケージの再バインド時にはクローズされます。
そのような場合、それ以後の実行時にエラーになる場合があります。
- WITH RETURN
- この文節は、
カーソルがストアード・プロシージャーからの結果セットとして使用されるよう意図されていることを示します。
WITH RETURN が使用されるのは、
DECLARE CURSOR ステートメントにストアード・プロシージャーのソース・コードが含まれている場合だけです。
これ以外の場合は、プリコンパイラーがこの文節を受け入れても、この文節は効力を持ちません。
SQL プロシージャーでは、
WITH RETURN を使用して宣言されたカーソルが SQL プロシージャーの終了後もクローズされずに残り、
SQL プロシージャーからの結果セットを定義します。
そして、その他のオープン・カーソルは、SQL プロシージャーが終了するときにすべてクローズされます。
外部ストアード・プロシージャー (LANGUAGE SQL を使用して定義されていないもの) では WITH RETURN 文節は効力を持たず、
外部プロシージャーの終了時に残っているオープン・カーソルがすべて結果セットとみなされます。
- TO CALLER
- カーソルが呼び出し側に結果セットを返すよう指定します。
たとえば、他のストアード・プロシージャーから呼び出しが行われた場合は、
そのストアード・プロシージャーに結果セットが返されます。
また、呼び出し側がクライアント・アプリケーションであるなら、
そのクライアント・アプリケーションに結果セットが返されます。
- TO CLIENT
- カーソルがクライアント・アプリケーションに結果セットを返すよう指定します。
このカーソルは、中間にネストされたプロシージャーからは認識されません。
- select-statement
- カーソルの SELECT ステートメントを指定します。
その select-statement には、
パラメーター・マーカーを含めることはできませんが、
ホスト変数への参照は含めることができます。
参照されるホスト変数の宣言は、
ソース・プログラムにおいて DECLARE CURSOR ステートメントよりも前になければなりません。
select-statement については、選択ステートメント を参照してください。
- statement-name
- カーソルの SELECT ステートメントは、
カーソルのオープン時に statement-name によって指定される
準備済み SELECT ステートメントです。
statement-name は、ソース・プログラムの他の DECLARE CURSOR ステートメントに
指定されている statement-name と同じであってはなりません。
準備済み SELECT ステートメントについては、PREPARE を参照してください。
注
-
他のプログラムから呼び出されたプログラム、
または同じプログラムの別のソース・ファイルから呼び出されたプログラムで、
呼び出し側プログラムによってオープンされたカーソルを使用することはできません。
- SQL 以外の LANGUAGE を使用する、
ネストされていないストアード・プロシージャーには、
WITH RETURN 文節を使用せずに DECLARE CURSOR が指定されるとデフォルトで WITH RETURN TO CALLER を使用し、
カーソルをクローズせずにプロシージャーに残すという性質があります。
このようにすることによって、
適当なクライアント・アプリケーションに結果セットを返すことができる
以前のバージョンのストアード・プロシージャーにも対応することができます。
この性質を無効にするには、
プロシージャーでオープンされているカーソルをすべてクローズしてください。
- カーソルの SELECT ステートメントが CURRENT DATE、CURRENT TIME、
または CURRENT TIMESTAMP を含む場合、これらの特殊レジスターを参照すると、
それぞれの FETCH で同一の値が与えられます。
この値は、カーソルがオープンされた時点で決まります。
この値は、カーソルのオープン時に決まります。
- データをより効率的に処理するために、データベース・マネージャーでは、
リモート・サーバーからデータを検索するときに、
読み取り専用カーソルに対してはデータ変更を禁止することができます。
FOR UPDATE 文節を使用するなら、データベース・マネージャーで、
カーソルが更新可能かどうかを決めることができます。
更新可能性は、アクセス・パス選択を決めるためにも使用されます。
カーソルを定位置 UPDATE または DELETE ステートメントで使用しない場合は、
FOR READ ONLY として宣言してください。
- オープン状態のカーソルは、結果表と、その表の行に対する相対位置を示します。
表は、カーソルの SELECT ステートメントによって指定される結果表です。
-
次のすべてが真の場合、カーソルは削除可能 です。
- 外部全選択の各 FROM 文節に、OUTER 文節を使用しないで、
基礎表または削除可能視点 (ネストした表式や共通表式またはニックネームを指定できない) が指定されている
- 外部全選択に VALUES 文節が含まれない
- 外部全選択に GROUP BY 文節も HAVING 文節も含まれない
- 外部全選択の選択リストに列関数が含まれない
- 外部全選択に、UNION ALL を除くセット演算 (UNION、EXCEPT、または INTERSECT) が含まれない
- 外部全選択の選択リストに DISTINCT が含まれない
- 選択ステートメントに ORDER BY 文節が含まれない
- 選択ステートメントに FOR READ ONLY 文節が含まれない
87
- 次の 1 つまたは複数が真である
- FOR UPDATE 文節が指定されている
88
- カーソルが静的に定義されている
- LANGLEVEL バインド・オプションが MIA または SQL92E である
カーソルに関連する外部全選択の選択リスト内の列は、
次のすべてが真の場合に、更新可能 です。
- カーソルが削除可能である
- 列の解決結果が基礎表の列となる
- LANGLEVEL バインド・オプションが MIA の場合、
SQL92E または select-statement が FOR UPDATE 文節を含んでいる (列が FOR UPDATE 文節で明示的または暗黙的に指定されている必要があります)。
カーソルが読み取り専用 であるのは、削除可能でない場合です。
次のすべてが真である場合、カーソルは未確定 です。
- 選択ステートメントが動的に準備される
- 選択ステートメントに FOR READ ONLY 文節も FOR UPDATE 文節も含まれていない
- LANGLEVEL バインド・オプションが SAA1 である
- それ以外の点では、カーソルは削除可能カーソルの条件を満たしている
未確定カーソルは、BLOCKING バインド・オプションが ALL の場合には読み取り専用とみなされます。
そうでない場合は、削除可能とみなされます。
- CLI を使用して作成されたアプリケーション・プログラムによって呼び出されるストアード・プロシージャーの中のカーソルは、
クライアント・アプリケーションに直接返される結果表を定義するために使用することができます。
また、SQL プロシージャーが WITH RETURN 文節を使用して定義される場合に限り、
そのプロシージャーの中のカーソルを呼び出し側の SQL プロシージャーに返すこともできます。
注を参照してください。
例
DECLARE CURSOR ステートメントは、SELECT の結果にカーソル名 C1 を関連付けます。
EXEC SQL DECLARE C1 CURSOR FOR
SELECT DEPTNO, DEPTNAME, MGRNO
FROM DEPARTMENT
WHERE ADMRDEPT = 'A00';
脚注:
- 87
-
FOR READ ONLY 文節については、
READ ONLY 文節で定義されています。
- 88
-
FOR UPDATE 文節については、
UPDATE 文節を参照してください。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]