PL/SQLのコードをコンパイルするとき、Oracleは潜在的な問題や非推奨な書き方を警告として通知してくれます。これらは実行エラーではないため無視されがちですが、将来的な不具合やパフォーマンス低下を防ぐ重要なヒントでもあります。DBMS_WARNINGパッケージを使うと、こうした警告を表示・非表示にしたり、レベルを制御することができます。ここではDBMS_WARNINGの基本と活用法を解説します。
PL/SQLコンパイル時に出る警告とは
Oracle 10g以降、PL/SQLコンパイル時に以下のような警告が表示される場合があります。例えば「条件が常にTRUEになる可能性がある」「RETURNのない関数」「非推奨の構文」などです。デフォルトでは多くが非表示ですが、警告を有効にすることでコード品質を高められます。
警告のカテゴリ
DBMS_WARNINGで制御できる警告は大きく分けて3種類です。
- PERFORMANCE(5000番台):非効率な記述に関する警告
- SEVERE(6000番台):将来のエラーにつながる可能性が高い重大な警告
- INFORMATIONAL(7000番台):開発者に注意を促す情報的な警告
DBMS_WARNINGを使って警告を制御する
警告の制御は、DBMS_WARNING.SET_WARNING_SETTING_STRING
またはDBMS_WARNING.SET_WARNING_SETTING_CATEGORY
を使います。前者はカテゴリごとの設定をまとめて文字列で指定する方法、後者はカテゴリ単位で設定する方法です。
-- 警告をすべて有効にする
EXEC DBMS_WARNING.SET_WARNING_SETTING_STRING('ENABLE:ALL', 'SESSION');
-- パフォーマンス警告のみ無効化
EXEC DBMS_WARNING.SET_WARNING_SETTING_CATEGORY('PERFORMANCE', 'DISABLE', 'SESSION');
-- 重大な警告(SEVERE)は有効、情報(INFO)は無効
EXEC DBMS_WARNING.SET_WARNING_SETTING_STRING('ENABLE:SEVERE, DISABLE:INFORMATIONAL', 'SESSION');
第2引数は設定の適用範囲で、'SESSION'
なら現在セッション内だけ有効、'SYSTEM'
ならデータベース全体に反映されます。
現在の警告設定を確認する
現在有効になっている警告カテゴリは、次の方法で確認できます。
SELECT DBMS_WARNING.GET_WARNING_SETTING_STRING FROM dual;
これにより「ENABLE:SEVERE, ENABLE:PERFORMANCE, DISABLE:INFORMATIONAL」のような設定文字列が返ります。
実際に警告を確認する
警告が有効な状態で、意図的に問題のある関数を作成してみます。
-- RETURN文がない関数(警告が出る例)
CREATE OR REPLACE FUNCTION f_no_return(p IN NUMBER) RETURN NUMBER IS
BEGIN
IF p > 0 THEN
RETURN p * 2;
END IF;
-- ELSE句でRETURNがない → 警告PLW-05005
END;
/
この場合、コンパイル時に「PLW-05005: RETURNがない可能性がある関数」という警告が表示されます。警告を無効にするとこのメッセージは出なくなります。
警告の活用シナリオ
- 品質向上:開発段階では警告をすべて有効にしてコードの健全性を高める
- 運用安定性:本番環境では情報レベルを無効にしてノイズを減らし、重大な警告のみ残す
- CI/CDパイプライン:ビルド時に警告を拾い、自動レビューで検出・修正を促す
まとめ
DBMS_WARNINGを活用すれば、PL/SQLコンパイル時に出る警告をカテゴリ単位で制御でき、開発フェーズに応じて適切な粒度で利用できます。開発初期はすべて有効に、運用時は重大な警告だけ残すなど、環境に応じて切り替えるのがベストプラクティスです。警告を積極的に活用することで、バグやパフォーマンス劣化を未然に防ぐ堅牢なコードを書くことができます。