Oracle に接続して SQL を実行している PHP のプログラムで、
ORA-01000 最大オープン・カーソル数を超えました
が発生したので、初期化パラメータ OPEN_CURSORS の値を大きくしてほしいと言われた。
ソースコードを見せてもらったら、ループの中で何回も同じ SQL を実行していたので、DB_common::prepare() を使うよう変更してもらったら解決した。Prepared Statement を使うと、ループの中で毎回新たにカーソルをオープンせずに、再利用されるので、ORA-01000 は起こらなくなる。
Prepared Statement を使うと、バインド変数が使われ、プライベートSQL領域(カーソル)も共有プールのライブラリキャッシュ内の共有SQL領域も再利用されるので、同じ処理が省略され、メモリ使用量も少なくなるので、エコで速い。