【Oracle】ORA-06550の原因と解決方法|PL/SQLコンパイルエラーの読み方

【Oracle】ORA-06550の原因と解決方法|PL/SQLコンパイルエラーの読み方 Oracle

ORA-06550: line n, column n は、Oracle PL/SQLの匿名ブロック、プロシージャ、ファンクション、パッケージ、トリガーなどでコンパイルエラーが起きた時に表示される入口メッセージです。多くの場合、ORA-06550そのものを直すのではなく、直後に続く PLS- エラーや PL/SQL: Statement ignored の行を読みます。

Oracle公式のORA-06550説明でも、通常はPL/SQLコンパイルエラーであり、先頭に出るline/columnと後続メッセージを確認して修正する流れです。そのため、ORA-06550は「本当の原因を探す入口」と考えると迷いにくくなります。

先に結論
ORA-06550が出たら、まず次の行以降の PLS-00103PLS-00306PLS-00201 などを確認します。構文エラーなら PLS-00103、引数不一致なら PLS-00306、識別子が見えないなら PLS-00201 が中心です。
スポンサーリンク

最初に見るべきエラー文

ORA-06550は、単独で原因を特定するエラーというより、後続のPL/SQLエラーへ案内するメッセージです。同じORA-06550でも、次の行に出ている文によって確認する場所が変わります。

後続メッセージ よくある意味 最初に見る場所
PLS-00103 構文として読めない セミコロン、THENEND IF、直前行
PLS-00306 呼び出し引数が合わない ALL_ARGUMENTS、プロシージャ定義、OUT引数
PLS-00201 識別子が見えない 宣言、スキーマ名、直接権限、シノニム
PL/SQL: Statement ignored 直前のエラーにより文が無視された この行ではなく直前のPLSエラー
PL/SQL: Compilation unit analysis terminated コンパイル単位の解析が止まった 最初に出たPLSエラー、パッケージ仕様部と本体

ORA-06550とは

ORA-06550は、PL/SQLのコンパイルまたは解析中にエラーがあったことを示します。単体で原因を説明するというより、後続のエラーをまとめる親メッセージのように表示されます。

ora-06550-message.txt
ORA-06550: line 4, column 3:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
   ;
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored

ORA-06550: line 1, column 7:
PL/SQL: Compilation unit analysis terminated
表示 意味 対応
ORA-06550 PL/SQL側でコンパイル/解析エラーが起きた 後続のPLSエラーを読む
line n, column n Oracleが異常に気づいた位置 その行と直前の構文を見る
PLS-00103 構文エラー セミコロン、BEGIN/END、IF/LOOPを確認
PL/SQL: Statement ignored 該当文が無視された 直前のPLSエラーを直す

まず読むべき順番

ORA-06550では、表示された行を上から順番に読むより、原因行を探す順番を決めると早いです。特に後続の PLS- エラーが複数出ている場合、最初のPLSエラーから直すのが基本です。

順番 見る場所 理由
1 最初の PLS- エラー 根本原因であることが多い
2 line / column 修正箇所の起点になる
3 エラー行の直前 セミコロンや閉じ忘れは前の行が原因になりやすい
4 PL/SQL: Statement ignored 結果として無視された文を確認する
5 USER_ERRORS DBオブジェクト作成時の残存エラーを確認する

line / columnの読み方

linecolumn は、Oracleがエラーに気づいた位置です。必ずしも原因そのものの位置とは限りません。PLS-00103のような構文エラーでは、直前の文末や閉じ忘れが原因でも、次の行でORA-06550が表示されます。

line-column-example.sql
BEGIN
  DBMS_OUTPUT.PUT_LINE('start')
  DBMS_OUTPUT.PUT_LINE('end');
END;
/
-- ORA-06550: line 3, column 3:
-- PLS-00103: Encountered the symbol "DBMS_OUTPUT" ...
-- 原因はline 2のセミコロン忘れ

構文エラーの読み方は PLS-00103の原因と解決方法 で詳しく整理しています。

PLS-00103が続く場合

PLS-00103 は、PL/SQLが予期しない記号やキーワードに遭遇した時のエラーです。セミコロン忘れ、THEN 忘れ、END IFEND LOOP の不足、SQLとPL/SQL構文の混同を確認します。

ora06550-pls00103.sql
BEGIN
  IF SYSDATE > DATE '2026-01-01'
    DBMS_OUTPUT.PUT_LINE('after 2026');
  END IF;
END;
/
-- ORA-06550
-- PLS-00103: Encountered the symbol "DBMS_OUTPUT" ...

この場合は IF 条件 THEN のように、PL/SQL構文として不足しているキーワードを補います。

PLS-00306が続く場合

PLS-00306 が続く場合は、呼び出しているプロシージャやファンクションの引数の数、型、順番、OUT / IN OUT の扱いが合っていません。

ora06550-pls00306.sql
BEGIN
  p_sync_order(1001);
END;
/
-- ORA-06550: line 2, column 3:
-- PLS-00306: wrong number or types of arguments in call to 'P_SYNC_ORDER'
-- ORA-06550: line 2, column 3:
-- PL/SQL: Statement ignored

この場合は、ALL_ARGUMENTS で宣言側の引数を確認します。詳しくは PLS-00306の原因と解決方法 を確認してください。

PL/SQL: Compilation unit analysis terminated が出る場合

PL/SQL: Compilation unit analysis terminated は、プロシージャ、ファンクション、パッケージなどのコンパイル単位を解析できずに終了したことを示します。この文自体を直すのではなく、同時に出ている最初の PLS- エラーを確認します。

ora06550-compilation-unit.sql
CREATE OR REPLACE PROCEDURE p_test IS
BEGIN
  missing_proc;
END;
/
-- ORA-06550: line 3, column 3:
-- PLS-00201: identifier 'MISSING_PROC' must be declared
-- ORA-06550: line 1, column 7:
-- PL/SQL: Compilation unit analysis terminated

この例では、解析終了メッセージよりも PLS-00201 が原因です。プロシージャ名が間違っていないか、権限がロール経由だけになっていないか、別スキーマなら schema.object で参照しているかを確認します。

PLS-00201が続く場合

PLS-00201 が続く場合は、変数、プロシージャ、パッケージ、テーブル、型などの識別子が見えていません。宣言漏れ、スコープ外参照、別スキーマ参照、権限不足、シノニム不足を確認します。

ora06550-pls00201.sql
BEGIN
  app_pkg.run_job;
END;
/
-- ORA-06550: line 2, column 3:
-- PLS-00201: identifier 'APP_PKG.RUN_JOB' must be declared
-- ORA-06550: line 2, column 3:
-- PL/SQL: Statement ignored

名前解決の問題は PLS-00201の原因と解決方法 を見ると切り分けやすいです。

PLS-00302・PLS-00323が続く場合

パッケージやレコード、カーソルまわりでは PLS-00302PLS-00323 がORA-06550と一緒に出ることがあります。どちらもパッケージ設計や公開範囲と関係しますが、見る場所が違います。

後続エラー 意味 見る場所
PLS-00302 入れ物の中に対象コンポーネントがない パッケージ仕様部、レコード項目、カーソル列
PLS-00323 仕様部に宣言したものが本体で定義されていない PACKAGE仕様部とPACKAGE BODY
PLS-00905 参照しているオブジェクトが無効 USER_ERRORS
ORA-04063 パッケージ本体やビューにエラーがある 依存オブジェクト、コンパイルエラー

コンポーネントが見えない場合は PLS-00302、仕様部と本体の不一致は PLS-00323、無効オブジェクトは PLS-00905ORA-04063 を確認します。

SHOW ERRORSで確認する

SQL*PlusやSQLclでプロシージャ、ファンクション、パッケージ、トリガーを作成した時は、SHOW ERRORS で直近のコンパイルエラーを確認できます。

show-errors.sql
CREATE OR REPLACE PROCEDURE p_test IS
BEGIN
  DBMS_OUTPUT.PUT_LINE('test')
END;
/

SHOW ERRORS PROCEDURE p_test;

エラー確認の流れは PL/SQLのコンパイル時エラーと警告 でも詳しく整理しています。

USER_ERRORS / ALL_ERRORSで確認する

DBオブジェクトとして作成したプロシージャやパッケージのエラーは、USER_ERRORSALL_ERRORS で確認できます。Oracle公式の USER_ERRORS 説明では、現在ユーザーが所有するストアドオブジェクトのエラー情報を確認できます。

user-errors-ora06550.sql
SELECT name,
       type,
       line,
       position,
       text
FROM user_errors
WHERE name = 'P_TEST'
ORDER BY sequence;
all-errors-ora06550.sql
SELECT owner,
       name,
       type,
       line,
       position,
       text
FROM all_errors
WHERE owner = 'APP_SCHEMA'
  AND name = 'PKG_ORDER'
ORDER BY sequence;

匿名ブロックで出る場合

BEGIN ... END; の匿名ブロックを実行してORA-06550が出る場合は、その場で実行したPL/SQLブロック内の構文や呼び出しが原因です。DBオブジェクトとして残らないため、USER_ERRORS には残らないことがあります。

見る場所 確認内容
エラーのline/column 匿名ブロック内の位置として読む
直前の文 セミコロン、閉じ忘れ、構文ミス
呼び出し先 プロシージャ名、引数、権限
実行方法 SQL Developer、SQL*Plus、アプリからの渡し方

プロシージャ・パッケージで出る場合

プロシージャやパッケージ作成時にORA-06550が出る場合は、オブジェクトのコンパイルに失敗しています。作成自体はされたがINVALIDになっていることもあるため、USER_OBJECTSUSER_ERRORS を確認します。

object-status-check.sql
SELECT object_name,
       object_type,
       status,
       last_ddl_time
FROM user_objects
WHERE object_name IN ('P_TEST', 'PKG_ORDER')
ORDER BY object_name, object_type;

INVALIDのまま実行すると、ORA-06508 のような実行時エラーにつながることがあります。

アプリケーションから実行した時だけ出る場合

Java、C#、PHP、Pythonなどのアプリケーションから実行した時だけORA-06550が出る場合は、SQL文字列の組み立て、バインド変数、匿名ブロックの書き方、改行やセミコロンの扱いを確認します。

原因 症状 対処
匿名ブロックの終端が不足 end-of-file やPLS-00103 BEGIN ... END; を完全に渡す
バインド変数不足 not all variables bound SQL内のプレースホルダとバインド数を合わせる
引数型が違う PLS-00306 DB側の引数定義とドライバ側の型を合わせる
権限・スキーマ違い PLS-00201 完全修飾名、直接権限、接続ユーザーを確認
SQL文字列が途中で切れている PLS-00103 ログに実際のSQL全文を出して確認

よくある原因と対処一覧

後続メッセージ 主な原因 対処
PLS-00103 構文エラー セミコロン、BEGIN/END、IF/LOOPを直す
PLS-00306 引数の数・型が違う ALL_ARGUMENTS で引数定義を確認
PLS-00201 識別子が見えない 宣言、スコープ、権限、シノニムを確認
PLS-00302 コンポーネントが見えない パッケージ仕様部やレコード項目を確認
PLS-00323 仕様部と本体が不一致 PACKAGE仕様部とBODYの見出しを合わせる
PLS-00905 オブジェクトが無効 USER_ERRORS でINVALID原因を直す
PL/SQL: Statement ignored 前のPLSエラーの結果 直前のPLSエラーを優先して直す

修正チェックリスト

項目 OKの状態
最初のPLSエラーを読んだ ORA-06550だけで判断していない
line/columnを確認した 該当行と直前行を見た
構文を確認した セミコロン、BEGIN/END、IF/LOOPが合っている
識別子を確認した 名前、スキーマ、権限、シノニムが合っている
引数を確認した 数、型、OUT/IN OUTが合っている
USER_ERRORSを確認した DBオブジェクトのエラーを把握している
実行環境を確認した SQL Developer、SQL*Plus、アプリで渡しているSQLが同じ

よくある質問

ORA-06550だけを見れば原因が分かりますか?

分からないことが多いです。ORA-06550は入口なので、直後のPLSエラーやPL/SQLメッセージを確認します。

lineとcolumnは必ず原因の位置ですか?

必ずしも原因そのものではありません。構文エラーでは、原因が直前行にあり、次の行で検出されることがあります。

USER_ERRORSに出ません

匿名ブロックの実行エラーはDBオブジェクトとして残らないため、USER_ERRORSに出ないことがあります。作成済みプロシージャやパッケージならUSER_ERRORSを確認します。

アプリからだけORA-06550になります

実際にアプリが送っているSQL全文、バインド変数、接続ユーザー、スキーマ、改行やセミコロンの扱いを確認してください。

PL/SQL: Statement ignored は何を直せばよいですか?

その行自体より、直前に出ているPLSエラーを直します。PL/SQL: Statement ignored は結果として文が無視されたことを示します。

まとめ

ORA-06550は、Oracle PL/SQLのコンパイルエラーや解析エラーで表示される入口メッセージです。本当の原因は、後続の PLS-00103PLS-00306PLS-00201PLS-00302PLS-00323 などに出ていることが多いです。

対応は、最初のPLSエラーを読み、line/columnと直前行を確認し、必要に応じて SHOW ERRORSUSER_ERRORSALL_ERRORS でDBオブジェクトのコンパイルエラーを確認する流れです。ORA-06550だけで止まらず、後続メッセージを読むのが最短です。

参考

ORA-06550 – Oracle Database Error Help

USER_ERRORS – Oracle Database Reference

PL/SQL Language Elements – Oracle Database PL/SQL Language Reference