ORA-00604 : 再帰SQLレベル1でエラーが発生しました というエラーは、Oracle内部で自動実行されるSQL(再帰SQL)の処理中に別のエラーが発生したことを示しています。
このエラー自体が直接の原因ではなく、背後にある本当のエラーを特定して対処することが解決への近道です。
本記事では、ORA-00604 が発生する仕組み、代表的な原因、確認方法、具体的な対処手順を分かりやすく解説します。

ORA-00604エラーの意味
ORA-00604 は、Oracle が内部で自動実行するSQL(再帰SQL)の実行中にエラーが発生した場合に出力されます。
再帰SQLとは、次のような処理で自動的に実行されるSQLです。
| 種類 | 内容 |
|---|---|
| トリガー | INSERT / UPDATE / DELETE 時に自動実行 |
| 制約チェック | 外部キーや一意制約の検証 |
| 権限チェック | オブジェクト参照時の権限確認 |
| PL/SQL | 関数・プロシージャ内のSQL |
| データディクショナリ参照 | USER_TABLES など |
つまり、ORA-00604 は「内部SQLで失敗しました」という通知であり、本当の原因は別のORAエラーです。
ORA-00604が発生する主な原因
トリガー内のSQLエラー
テーブルに対する操作時にトリガーが発火し、その中のSQLが失敗すると ORA-00604 が発生します。
例:
・存在しないテーブルを参照
・権限不足
・数値型・文字型の変換エラー
ユーザー定義関数・プロシージャのエラー
SQL文の中でユーザー定義関数を使用している場合、その関数内部でエラーが発生すると ORA-00604 になります。
例:
・SELECT 文で呼び出した関数内で例外発生
・NULLを想定していない処理
・TO_NUMBER 変換エラー
権限不足(ORA-01031)
再帰SQL中に、実行ユーザーに権限がないオブジェクトへアクセスすると発生します。
代表例:
・トリガー内で別スキーマの表を参照
・シーケンスへのアクセス権限がない
データディクショナリ破損・不整合
まれに、SYSオブジェクトや内部ビューの不整合が原因となる場合があります。
例:
・統計情報の不整合
・データディクショナリの破損
表示される典型的なエラー例
ORA-00604 は多くの場合、次のエラーとセットで表示されます。
| 表示例 | 意味 |
|---|---|
| ORA-00604: 再帰SQLレベル1でエラーが発生しました | 内部SQLで失敗 |
| ORA-00942: 表またはビューが存在しません | 参照先なし |
| ORA-06502: 数値または値エラー | 型変換失敗 |
| ORA-01031: 権限が不足しています | 権限不足 |
| ORA-04098: トリガーが無効 | トリガー異常 |
重要なのは、ORA-00604 ではなく、その直後に表示されるエラーです。
原因を特定する方法
1. エラーメッセージ全文を確認する
SQL*Plus やアプリケーションログに出力される全文を必ず確認します。
|
1 2 |
ORA-00604: 再帰SQLレベル1でエラーが発生しました ORA-00942: 表またはビューが存在しません |
この場合、真の原因は ORA-00942 です。
2. トリガーを確認する
対象テーブルにトリガーが存在するか確認します。
|
1 2 3 |
SELECT trigger_name, status FROM user_triggers WHERE table_name = 'テーブル名'; |
無効化して切り分けも可能です。
|
1 |
ALTER TRIGGER トリガー名 DISABLE; |
3. 関数・プロシージャを確認する
使用している関数の中でエラーが発生していないか確認します。
|
1 |
SHOW ERRORS FUNCTION 関数名; |
4. 権限を確認する
|
1 2 3 |
SELECT * FROM user_tab_privs WHERE table_name = '参照先テーブル名'; |
代表的な対処方法
トリガーのSQLを修正する
・存在しない表を参照していないか
・列名が正しいか
・NULL処理があるか
関数のエラー処理を追加する
例:
|
1 2 3 |
EXCEPTION WHEN OTHERS THEN RETURN NULL; |
関数内でエラーが発生しても処理が止まらないようにします。
権限を付与する
|
1 |
GRANT SELECT ON スキーマ.テーブル名 TO ユーザー名; |
無効なトリガーを再作成する
|
1 |
ALTER TRIGGER トリガー名 ENABLE; |
開発現場でよくあるパターン
| パターン | 内容 |
|---|---|
| 本番でだけ発生 | 権限差異が原因 |
| INSERT時だけ発生 | INSERTトリガー内エラー |
| SELECTで発生 | 関数内部エラー |
| 特定データだけ発生 | 型変換失敗 |
よくある質問(Q & A)
- ORA-00604 だけ表示されて原因が分かりません。
-
ほぼ必ず他のORAエラーが同時に出ています。アプリケーションログやSQL*Plusの出力を全文確認してください。
- トリガーを無効にすると直ります。問題ないですか?
-
一時的な切り分けとしては有効ですが、恒久対策としてはトリガーのSQL修正が必要です。
- SELECT 文でも発生しますか?
-
発生します。SELECT 内で呼び出しているユーザー定義関数が原因になることがあります。
- 再帰SQLとは自分が書いたSQLですか?
-
多くの場合は Oracle が内部で自動実行しているSQLです。
まとめ
ORA-00604 エラーは、それ自体が原因ではありません。
必ず裏に存在する ORA-00942 や ORA-06502 などのエラーを特定し、トリガー・関数・権限を重点的に確認することが解決の近道です。
エラー全文を確認し、再帰SQLが実行されるポイントを特定すれば、原因の切り分けは難しくありません。
ORA-00604 エラーの背後では、実際には別のエラーが発生しているケースがほとんどです。
特に多いのが ORA-00942(表またはビューが存在しません) です。
ORA-00942 が原因で ORA-00604 が発生するケースについては、次の記事で詳しく解説しています。



