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

このエラー自体は “直接の原因” ではありませんが、
「どこでエラーが発生したか(行番号)」を示す重要なヒント になります。
本記事では、ORA-06512 の読み方から、
実務でよくある典型パターン、根本原因の探し方までを丁寧に解説します。
■ ORA-06512 とは何か?
📌 ORA-06512 の意味
ORA-06512 は、以下のように エラーが発生した PL/SQL ブロック内の行番号 を通知するメッセージです。
上から順に「実際にエラーが発生した場所 → 呼び出し元」 が積み重なって表示されます。
■ 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)
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 の保守効率が大幅に上がります。
