Oracleデータベースで PL/SQL を扱っていると、
「ORA-06512」 がセットで表示されるエラーに遭遇することがあります。
このエラー自体は “直接の原因” ではありませんが、
「どこでエラーが発生したか(行番号)」を示す重要なヒント になります。
本記事では、ORA-06512 の読み方から、
実務でよくある典型パターン、根本原因の探し方までを丁寧に解説します。
■ ORA-06512 とは何か?
📌 ORA-06512 の意味
ORA-06512 は、以下のように エラーが発生した PL/SQL ブロック内の行番号 を通知するメッセージです。
|
1 2 3 |
ORA-06512: at line 25 ORA-06512: at "SCHEMA.PACKAGE_NAME", line 120 ORA-06512: at "SCHEMA.PROC_NAME", line 55 |
上から順に「実際にエラーが発生した場所 → 呼び出し元」 が積み重なって表示されます。
■ ORA-06512 の仕組み
✔ 直接のエラーではない
実際のエラーは別の ORA-xxxx(例:ORA-00001、ORA-01403)が先に出ています。
ORA-06512 は「補足情報」であり、
スタックトレースとして “どこで” エラーが起きたかを示す行情報 です。
✔ 例外がネストすると複数行に出る
ストアドプロシージャ → パッケージ → 関数のように呼び出しが深いほど、
ORA-06512 が複数行連続で表示されます。
■ ORA-06512 の読み方(エラー行の見つけ方)
📌 まず最初に見るべきは「一番上の ORA-xxxx」
例:
最上段の ORA-01403 が本当のエラー
25行目(PROC_A)でエラーが発生
PROC_A が PROC_B から呼ばれたため、PROC_B のエラー行も出ている
📌 実務的な手順
最初に出ている ORA-xxxx を確認
次に、直後の ORA-06512 が示す「行番号」を確認
エディタ(SQL Developer/PL/SQL Developer)で該当行を確認
呼び出し元(上位)に問題がないかも併せてチェック
■ よくある典型的な原因4パターン
パターン①:NOT NULL制約違反(ORA-01400)
|
1 2 |
ORA-01400: cannot insert NULL ORA-06512: at line 45 |
INSERT/UPDATE 時に必須項目が NULL。
参考:「ORA-01400 NULLを挿入できません|INSERT時のエラー原因と対応手順」
パターン②:一意制約違反(ORA-00001)
|
1 2 |
ORA-00001: unique constraint violated ORA-06512: at "SCHEMA.PKG_A", line 120 |
シーケンス採番やキー生成ロジックの競合が多い。
参考:「ora-00001|Oracleの一意制約(UNIQUE制約)違反の原因と対処方法」
パターン③:NO DATA FOUND(ORA-01403)
|
1 2 |
ORA-01403: no data found ORA-06512: at line 60 |
SELECT INTO に結果が返らない場合。
参考:「ORA-01403 | データが1件も返らない時の典型原因と修正方法」
パターン④:VALUE_ERROR(桁あふれ)
|
1 2 |
ORA-06502: PL/SQL numeric or value error ORA-06512: at line 80 |
型変換/桁不足/文字列代入エラー。
■ ORA-06512 の原因を特定する調査手順
① 最初に出る ORA-xxxx を確認
そこが 根本原因 です。
② ORA-06512 の直後の行番号を確認
もっとも “深い階層” の行が本当の発生箇所。
③ 当該行周辺のロジックを確認
SELECT INTO の取り扱い
NULL の可能性
変数型の長さ
例外処理(EXCEPTION WHEN)で握りつぶしていないか
④ 再現テストを実行
可能であればパラメータを固定してエラー再現。
⑤ 例外のネストを読み解く
複数の ORA-06512 が出た場合、上から順に
発生 → 呼び出し元 → さらに呼び出し元
を追いかけるだけで原因にたどり着けます。
■ エラー行が特定できないときの対処法
✔ パッケージ仕様(SPEC)ではなく BODY を見る
よく混同されますが、行番号が振られているのは BODY です。
✔ SQL Developer で行番号を表示
環境設定 → エディタ → 行番号を表示。
✔ パッケージ再コンパイル後は行番号が変わる?
変わりません。
あくまで コード中の行番号 が基準です。
よくある質問(Q & A)
- ORA-06512 だけが表示された場合の原因は?
-
通常、ORA-06512 は単独では根本原因を示すエラーではありません。
ほとんどの場合、上位に他の ORA-xxxx(例:ORA-01403、ORA-00001)が先に表示されています。
もし ORA-06512 のみが見える場合は、以下を確認してください:- SQL*Plus/SQL Developer の出力が切れていないか
- エラー箇所へ到達する前に例外がキャッチされている
- トリガやネストしたプロシージャ/関数内でエラーが隠れていないか
ポイントは「最初の ORA-xxxx を探すこと」です。
ORA-06512 は位置情報なので、必ず原因側のエラーを確認しましょう。 - ORA-06512 の行番号が期待した位置と違う場合、どう調査する?
-
行番号は次の点に注意して調査します:
- パッケージ仕様(SPEC)ではなく 実装(BODY)の行番号を見る
→ SPEC には行番号が割り振られません。 - コメント行や改行により実際の行番号がずれている場合あり
→ 実行環境とソースエディタで行番号が一致するか確認。 - 無名ブロック(BEGIN~END)を実行している場合
→ 1行目が BEGIN になり行番号がずれる可能性あり。 - コード生成ツールで自動生成された SQL の場合
→ 実体ソースとログ上の行番号が一致しないケースがある。
こうしたズレを踏まえ、 該当エラー前後 5〜10 行を広めに確認するのが実務的なコツ です。
- パッケージ仕様(SPEC)ではなく 実装(BODY)の行番号を見る
- ORA-06512 がプロシージャの呼び出し階層別に複数出るときの見方は?
-
ネストしたプロシージャ/関数を呼び出すような構造の場合、ORA-06512 は以下のように複数表示されます:
1234ORA-00001: unique constraint violatedORA-06512: at "HR.PKG_A", line 120 ← 実際の発生箇所ORA-06512: at "HR.PKG_B", line 85 ← 呼び出し元ORA-06512: at line 1 ← 更に上位- 一番下の ORA-00001 が根本原因
- 直後の ORA-06512(120行)が発生ポイント
- 上位に向かって呼び出し元のトレース
このように エラー連鎖の最初と、ネスト深さを読み解くこと が重要です。
段階的に上位の呼び出し元も確認していきましょう。
■ まとめ
ORA-06512 は 「エラー行の位置情報」 を示すだけ
原因となるエラーは別の ORA-xxxx で提示されている
最上段の ORA-xxxx を確認し、直後の ORA-06512 の行番号を調査
典型的な原因 → NOT NULL、UNIQUE、NO DATA FOUND、VALUE_ERROR など
PL/SQL の呼び出し階層が深い場合はトレースが鍵
ORA-06512 はエラー解析の入口として非常に重要です。
行番号の読み解き方を理解すれば、PL/SQL の保守効率が大幅に上がります。




