プライマリ・コンテンツに移動
Oracle® Database Oracleプリコンパイラのためのプログラマーズ・ガイド
12c リリース1 (12.1)
B71398-03
目次へ移動
目次
索引へ移動
索引

前
次

カーソルの使用について

すべての埋込みSQL文は、DECLARE CURSOR文で明示的に、またはプリコンパイラによって暗黙的に、カーソルを割り当てられます。内部的には、Oracle Precompilersはカーソル・キャッシュと呼ばれるキャッシュを維持して、埋込みSQL文の実行を制御します。すべてのSQL文は実行時に、カーソル・キャッシュ内にエントリを割り当てられます。このエントリは、Oracle内のプログラム・グローバル領域(PGA)にあるプライベートSQL領域にリンクされます。

MAXOPENCURSORSHOLD_CURSORおよびRELEASE_CURSORなどの各種プリコンパイラ・オプションを使用して、カーソル・キャッシュを管理することで、パフォーマンスが改善されます。たとえば、RELEASE_CURSORでは、カーソル・キャッシュとプライベートSQL領域間のリンクに起こることを制御します。RELEASE_CURSOR=YESを指定すると、OracleでSQL文が実行された後、リンクが削除されます。これにより、プライベートSQL領域に割り当てられたメモリーが解放され、解析ロックが解除されます。

カーソル・キャッシュ管理のために、埋込みPL/SQLブロックはSQL文と同様に扱われます。実行時に、親カーソルと呼ばれるカーソルが、PL/SQLブロック全体と関連付けられます。カーソル・キャッシュには対応するエントリが作成され、このエントリがPGA内のプライベートSQL領域にリンクします。

PL/SQLブロック内の各SQL文にも、PGAのプライベートSQL領域が必要です。したがって、これらのSQL文のために、PL/SQLでは子カーソル・キャッシュと呼ばれる個別のキャッシュが管理されます。このカーソルは、子カーソルと呼ばれます。子カーソル・キャッシュの管理はPL/SQLによって行われるため、ユーザーは子カーソルを直接制御できません。

プログラムで同時に使用できるカーソルの最大数は、Oracle初期化パラメータのOPEN_CURSORSによって設定されます。図5-1は、使用されるカーソルの最大数を計算する方法を示しています。

図5-1 使用される最大カーソル数

図5-1の説明が続きます
「図5-1 使用される最大カーソル数」の説明

OPEN_CURSORSで設定された制限をプログラムが超えると、次のOracleエラーが発生します。

ORA-01000: maximum open cursors exceeded

このエラーは、RELEASE_CURSOR=YESオプションとHOLD_CURSOR=NOオプションを指定すれば回避できます。RELEASE_CURSORYESに設定してプログラム全体をプリコンパイルする必要ない場合は、次のように、単に各PL/SQLブロックの後でオプションをNOにリセットします。

EXEC ORACLE OPTION (RELEASE_CURSOR=YES);
-- first embedded PL/SQL block
 EXEC ORACLE OPTION (RELEASE_CURSOR=NO);
-- embedded SQL statements
 EXEC ORACLE OPTION (RELEASE_CURSOR=YES);
-- second embedded PL/SQL block
 EXEC ORACLE OPTION (RELEASE_CURSOR=NO);
-- embedded SQL statements

代替方法

MAXOPENCURSORSオプションは、カーソル・キャッシュの初期サイズを指定します。たとえば、MAXOPENCURSORS=10の場合、カーソル・キャッシュでは最大10エントリを保持できます。新しいカーソルが必要なのに、空いているキャッシュ・エントリがなく、HOLD_CURSOR=NOに設定されている場合、プリコンパイラではエントリの再利用を試みます。MAXOPENCURSORSに非常に少ない値を指定すると、プリコンパイラは親カーソルを頻繁に再利用せざるを得なくなります。親カーソルが再利用されると同時に、子カーソルはすべて解放されます。