すべての埋込みSQL文は、DECLARE
CURSOR
文で明示的に、またはプリコンパイラによって暗黙的に、カーソルを割り当てられます。内部的には、Oracle Precompilersはカーソル・キャッシュと呼ばれるキャッシュを維持して、埋込みSQL文の実行を制御します。すべてのSQL文は実行時に、カーソル・キャッシュ内にエントリを割り当てられます。このエントリは、Oracle内のプログラム・グローバル領域(PGA)にあるプライベートSQL領域にリンクされます。
MAXOPENCURSORS
、HOLD_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は、使用されるカーソルの最大数を計算する方法を示しています。
OPEN_CURSORS
で設定された制限をプログラムが超えると、次のOracleエラーが発生します。
ORA-01000: maximum open cursors exceeded
このエラーは、RELEASE_CURSOR
=YES
オプションとHOLD_CURSOR
=NO
オプションを指定すれば回避できます。RELEASE_CURSOR
をYES
に設定してプログラム全体をプリコンパイルする必要ない場合は、次のように、単に各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