PL/SQLでプロシージャや関数、パッケージを作成するときに避けて通れないのが「コンパイルエラー」です。構文ミスや型の不一致などにより、意図した通りにオブジェクトが作成されないケースがあります。
本記事では、SHOW ERRORSやUSER_ERRORSビューを使って、PL/SQLオブジェクトのコンパイルエラーを素早く特定し、効率的に修正するための方法を解説します。
PL/SQLオブジェクトのコンパイルとは?
PL/SQLでは、ストアドプロシージャ・ファンクション・パッケージなどのオブジェクトを作成する際に、Oracleがソースコードを解析・コンパイルします。
このコンパイル過程でエラーがあると、INVALID状態になり、オブジェクトは正しく実行できません。開発・保守においては、エラーの検出と修正が不可欠です。
SHOW ERRORSコマンドの使い方
SQL*PlusやSQL Developerなどのツールから、コンパイル後すぐにエラー内容を確認したいときに便利なのがSHOW ERRORS
コマンドです。
基本構文
SHOW ERRORS [OBJECT TYPE] [OBJECT NAME];
使用例
SHOW ERRORS PROCEDURE my_procedure;
このコマンドにより、直近のエラーが表示されます。表示される内容は以下のようになります。
LINE/COL ERROR
-------- ----------------------------------------------------
3/10 PL/SQL: ORA-00942: table or view does not exist
4/5 PLS-00201: identifier 'MY_VARIABLE' must be declared
このように、エラー行と列、メッセージが一覧で確認できるため、該当箇所の修正に役立ちます。
USER_ERRORSビューでエラーを確認
Oracleでは、エラー情報を動的パフォーマンスビューとして提供しています。USER_ERRORSは、ログインユーザーが作成したオブジェクトのエラーを一覧で取得できるビューです。
基本構文
SELECT name, type, line, position, text
FROM user_errors
WHERE name = 'MY_PROCEDURE'
ORDER BY sequence;
このSQLを実行すると、指定したオブジェクトのエラーが複数行に渡って取得されます。たとえば、以下のように表示されます。
NAME TYPE LINE POSITION TEXT
------------ ----------- ----- --------- ------------------------------------
MY_PROCEDURE PROCEDURE 3 10 PL/SQL: ORA-00942: table or view does not exist
MY_PROCEDURE PROCEDURE 4 5 PLS-00201: identifier 'MY_VARIABLE' must be declared
複数のエラーを一括確認・記録したいときや、ツール非依存でエラーを確認したい場合に便利です。
ALL_ERRORS・DBA_ERRORSとの違い
USER_ERRORSは自身のスキーマのオブジェクトに限定されますが、他ユーザーのオブジェクトエラーも確認したい場合は以下のビューを使用します。
- ALL_ERRORS:アクセス可能なすべてのオブジェクトのエラーを表示
- DBA_ERRORS:データベース全体のオブジェクトのエラーを表示(DBA権限が必要)
使用例
SELECT owner, name, type, line, position, text
FROM all_errors
WHERE name = 'MY_FUNCTION';
複数スキーマでオブジェクトを管理している大規模開発環境では特に有効です。
コンパイル時の注意点
- 依存オブジェクトの存在: 呼び出し先のテーブルやパッケージが存在しないとエラーになります。
- 順序: パッケージ本体よりもパッケージ仕様を先にコンパイルする必要があります。
- 再コンパイル:
ALTER PROCEDURE xxx COMPILE;
などで手動再コンパイルが可能です。
まとめ
PL/SQL開発では、コンパイルエラーをいかに迅速に検出し、正しく修正するかが効率に直結します。
SHOW ERRORSは手軽にエラー確認ができる即時ツールとして活用し、USER_ERRORSはSQLベースでのエラーログ取得・分析に役立ちます。さらに大規模開発ではALL_ERRORS
やDBA_ERRORS
も活用して、スムーズなエラー解決体制を整えましょう。