【PL/SQL】DBMS_WARNINGでコンパイル時の警告を制御する方法

【PL/SQL】DBMS_WARNINGでコンパイル時の警告を制御する方法 PL/SQL

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コンパイル時に出る警告をカテゴリ単位で制御でき、開発フェーズに応じて適切な粒度で利用できます。開発初期はすべて有効に、運用時は重大な警告だけ残すなど、環境に応じて切り替えるのがベストプラクティスです。警告を積極的に活用することで、バグやパフォーマンス劣化を未然に防ぐ堅牢なコードを書くことができます。