概要
ORA-01000: 最大オープン・カーソル数を超えました。
ORA-01000: maximum open cursors exceeded
OracleをActive Recordで使うためのgem、rsim/oracle-enhancedで起こり得る最大オープンカーソル超過問題について原因と解決策をメモ。確認環境はRails 5.1系、oracle-enhanced 1.8.2。
解決方法
Oracleで設定されているOpen Cursorsよりもやや少ない数をdatabase.ymlでstatement_limitとして設定する。
SQL> select name,value from v$parameter where name = 'open_cursors';
=> 300
database.yml
default: &default
adapter: oracle_enhanced
statement_limit: 250
Open Cursorsが1200ならstatement_limitを1000、300なら250など。エラー文面からは超過しないように一致するよう設定すればよいようにも読めるが、実際には余剰にカーソルが消費されることがありギリギリだと超過エラーが発生する。
解説
見ての通り、Oracle側で設定されたOpen cursors以上にカーソルを消費しようとした場合に発生するエラー。adapter 1.8.0からstatement_limitのデフォルト値が1000になっており、Oracle側のopen cursorsがそれを下回るような環境ではエラーが発生するようになった。