プログラムからOracleへ接続してデータを操作するロジックを組み、いざ実行!となった時にハマったエラーで「ORA-01000」がありました。
Oracleからエラーを吐いているいるけど、いろいろ調べると複合的なエラーの一部でした。
主にロジックが悪い(カーソルの開放し忘れなど・・・)ことによるリソースの枯渇が原因で、前段で
「ORA-00604: 再帰SQLレベル1でエラーが発生しました。」
が発生して
「ORA-01000: 最大オープン・カーソル数を超えました。」
でプログラムが停止していました。
ロジックの見直しは行うのですが、その前にOracleDBから情報を取得します。
★初期パラメータ「OPEN_CURSORS」最大カーソル数の確認
SQL> show parameters open_cursors; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ open_cursors integer 300
★初期パラメータ「OPEN_CURSORS」最大カーソル数の変更
300→1000
SQL> alter system set open_cursors = 1000; SQL> show parameters open_cursors; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ open_cursors integer 1000
これでエラーは出なくなりましたが腑に落ちないのでロジックは別途見直し。
因みにどのセッションでどんなSQL文のカーソルがオープンされているかを調べるなら
SQL> SELECT SID, USER_NAME, SQL_TEXT FROM V$OPEN_CURSOR; SID USER_NAME ---------- ------------------------------ SQL_TEXT ------------------------------------------------------------ 27 SYSTEM SELECT SID, USER_NAME, SQL_TEXT FROM V$OPEN_CURSOR 133 SYSMAN INSERT INTO mgmt_db_rollback_segs_ecm(AVEACTIVE, AVESHRINK, 135 SYS select 1 from obj$ where name='DBA_QUEUE_SCHEDULES' SID USER_NAME ---------- ------------------------------ SQL_TEXT ------------------------------------------------------------ 139 SYS select schedule_mode, start_calibrate, num_votes, synced 139 SYS SELECT OBJOID, CLSOID, (2*PRI + DECODE(BITA ・ ・ ・ 521行が選択されました。
意外にいっぱいあることがわかった・・・この情報をもとに引っかかっている未開放のリソースを開放できるように修正する。
がんばるか・・・。