「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

Oracleデータベースで PL/SQL を扱っていると、
「ORA-06512」 がセットで表示されるエラーに遭遇することがあります。
ORA-06512

このエラー自体は “直接の原因” ではありませんが、
「どこでエラーが発生したか(行番号)」を示す重要なヒント になります。

本記事では、ORA-06512 の読み方から、
実務でよくある典型パターン、根本原因の探し方までを丁寧に解説します。


■ ORA-06512 とは何か?

📌 ORA-06512 の意味

ORA-06512 は、以下のように エラーが発生した PL/SQL ブロック内の行番号 を通知するメッセージです。

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 のエラー行も出ている

📌 実務的な手順

  1. 最初に出ている ORA-xxxx を確認

  2. 次に、直後の ORA-06512 が示す「行番号」を確認

  3. エディタ(SQL Developer/PL/SQL Developer)で該当行を確認

  4. 呼び出し元(上位)に問題がないかも併せてチェック


■ よくある典型的な原因4パターン

パターン①:NOT NULL制約違反(ORA-01400)

INSERT/UPDATE 時に必須項目が NULL。

パターン②:一意制約違反(ORA-00001)

シーケンス採番やキー生成ロジックの競合が多い。
参考:「https://write-remember.com/tech/oracle-unique-constraint-ora00001-solution/

パターン③:NO DATA FOUND(ORA-01403)

SELECT INTO に結果が返らない場合。

パターン④:VALUE_ERROR(桁あふれ)

型変換/桁不足/文字列代入エラー。


■ ORA-06512 の原因を特定する調査手順

① 最初に出る ORA-xxxx を確認

そこが 根本原因 です。

② ORA-06512 の直後の行番号を確認

もっとも “深い階層” の行が本当の発生箇所。

③ 当該行周辺のロジックを確認

  • SELECT INTO の取り扱い

  • NULL の可能性

  • 変数型の長さ

  • 例外処理(EXCEPTION WHEN)で握りつぶしていないか

④ 再現テストを実行

可能であればパラメータを固定してエラー再現。

⑤ 例外のネストを読み解く

複数の ORA-06512 が出た場合、上から順に
発生 → 呼び出し元 → さらに呼び出し元
を追いかけるだけで原因にたどり着けます。


■ エラー行が特定できないときの対処法

✔ パッケージ仕様(SPEC)ではなく BODY を見る

よく混同されますが、行番号が振られているのは BODY です。

✔ SQL Developer で行番号を表示

環境設定 → エディタ → 行番号を表示。

✔ パッケージ再コンパイル後は行番号が変わる?

変わりません。
あくまで コード中の行番号 が基準です。


■ まとめ

  • ORA-06512 は 「エラー行の位置情報」 を示すだけ

  • 原因となるエラーは別の ORA-xxxx で提示されている

  • 最上段の ORA-xxxx を確認し、直後の ORA-06512 の行番号を調査

  • 典型的な原因 → NOT NULL、UNIQUE、NO DATA FOUND、VALUE_ERROR など

  • PL/SQL の呼び出し階層が深い場合はトレースが鍵

ORA-06512 はエラー解析の入口として非常に重要です。
行番号の読み解き方を理解すれば、PL/SQL の保守効率が大幅に上がります。

Ads by Google