プログラムからOracleへ接続してデータを操作するロジックを組み、いざ実行!となった時にハマったエラーで「ORA-01000」がありました。
Oracleからエラーを吐いているいるけど、いろいろ調べると複合的なエラーの一部でした。
主にロジックが悪い(カーソルの開放し忘れなど・・・)ことによるリソースの枯渇が原因で、前段で
「ORA-00604: 再帰SQLレベル1でエラーが発生しました。」
が発生して
「ORA-01000: 最大オープン・カーソル数を超えました。」
でプログラムが停止していました。
ロジックの見直しは行うのですが、その前にOracleDBから情報を取得します。
★初期パラメータ「OPEN_CURSORS」最大カーソル数の確認
1 2 3 4 5 | SQL> show parameters open_cursors; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ open_cursors integer 300 |
★初期パラメータ「OPEN_CURSORS」最大カーソル数の変更
300→1000
1 2 3 4 5 6 7 | SQL> alter system set open_cursors = 1000; SQL> show parameters open_cursors; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ open_cursors integer 1000 |
これでエラーは出なくなりましたが腑に落ちないのでロジックは別途見直し。
因みにどのセッションでどんなSQL文のカーソルがオープンされているかを調べるなら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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行が選択されました。 |
意外にいっぱいあることがわかった・・・この情報をもとに引っかかっている未開放のリソースを開放できるように修正する。
がんばるか・・・。