プログラムから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行が選択されました。
意外にいっぱいあることがわかった・・・この情報をもとに引っかかっている未開放のリソースを開放できるように修正する。
がんばるか・・・。