ablog

不器用で落着きのない技術者のメモ

PHPで「ORA-01000 最大オープン・カーソル数を超えました」が発生

Oracle に接続して SQL を実行している PHP のプログラムで、

ORA-01000 最大オープン・カーソル数を超えました

が発生したので、初期化パラメータ OPEN_CURSORS の値を大きくしてほしいと言われた。


ソースコードを見せてもらったら、ループの中で何回も同じ SQL を実行していたので、DB_common::prepare() を使うよう変更してもらったら解決した。Prepared Statement を使うと、ループの中で毎回新たにカーソルをオープンせずに、再利用されるので、ORA-01000 は起こらなくなる。

Prepared Statement を使うと、バインド変数が使われ、プライベートSQL領域(カーソル)も共有プールのライブラリキャッシュ内の共有SQL領域も再利用されるので、同じ処理が省略され、メモリ使用量も少なくなるので、エコで速い。