4. PL/SQL エラー処理

 


📝 PL/SQLのエラー処理入門! 例外を使いこなそう

プログラミングをしていると、予期せぬエラーが起こることがあります。たとえば、存在しないデータを探したり、間違った値を入力したり…。

エラーが起こると、プログラムは突然止まってしまいます。これを防ぎ、エラーが起きても graceful(優雅)に処理を続けるために使うのが「例外(Exception)」です。

PL/SQLでは、EXCEPTIONブロックを使って、エラーを捕まえて、適切な対応をすることができます。


1. 例外って何? 🧐

例外とは、プログラムの実行中に発生するエラーのことです。PL/SQLには、あらかじめ用意された例外と、自分で作る例外の2種類があります。

① システム定義の例外

Oracleが最初から用意しているエラーのことです。例えば、以下のようなものがあります。

  • NO_DATA_FOUNDSELECT文でデータが見つからなかったとき

  • TOO_MANY_ROWSSELECT INTO文で複数のデータが見つかったとき

これらの例外は、名前をそのまま使ってエラーを捕まえることができます。

② ユーザー定義の例外

ビジネス上の特別なルールに違反したときに、自分でエラーを発生させたい場合に作ります。例えば、「顧客IDは0より大きい値でなければならない」といったルールです。


2. 例外処理の基本構造 🧱

PL/SQLのEXCEPTIONブロックは、BEGINブロックの後に配置します。

【構文】

SQL
BEGIN
  -- ここに通常の処理を書く
EXCEPTION
  WHEN 例外名1 THEN
    -- 例外1が発生したときの処理
  WHEN 例外名2 THEN
    -- 例外2が発生したときの処理
  WHEN OTHERS THEN
    -- 上記以外の、その他のエラーが発生したときの処理
END;
/

WHEN OTHERS THEN は、予期せぬエラーをすべてキャッチしてくれる非常に便利な機能です。


3. システム定義の例外を使ってみよう! 🎣

ここでは、SELECT INTO文で発生しやすい2つの例外を例に、使い方を見ていきましょう。

例外名発生する状況
NO_DATA_FOUNDデータベースに存在しないデータを検索したとき。
TOO_MANY_ROWS検索条件に一致するデータが複数見つかったとき。
もし例外処理を書いていなければ、これらのエラーが起きたときにプログラムは強制終了してしまいます。

【エラーをキャッチするコード】

SQL
-- `get_customer`というプロシージャがあると仮定
BEGIN
  get_customer(141); -- 存在しないID
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('データが見つかりませんでした。');
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('データが複数見つかりました。検索条件を絞り込んでください。');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('その他のエラーが発生しました。');
END;
/

このコードを実行すると、get_customer(141)でエラーが起きてもプログラムは止まらず、NO_DATA_FOUNDが捕まえられて、DBMS_OUTPUT.PUT_LINEでメッセージが表示されます。

もしWHEN OTHERSを書いていなければ、TOO_MANY_ROWSを処理しないプログラムはエラーで停止してしまいます。 逆に、TOO_MANY_ROWSを適切に処理すれば、そのエラーはOTHERSには行きません。 つまり、特定の例外を先に処理し、それ以外のすべてのエラーをWHEN OTHERSで捕まえるのが、ベストプラクティスです。


4. ユーザー定義の例外を作ってみよう! ✍️

Oracleが用意していない特別なルール(ビジネスロジック)のエラーを処理したい場合は、自分で例外を作ります。

【3つのステップ】

  1. 例外の宣言: DECLAREブロックで例外を宣言します。

    • 例外名 EXCEPTION;

  2. 例外の発生: RAISE文を使って、任意の場所で例外を発生させます。

    • RAISE 例外名;

  3. 例外の捕捉: EXCEPTIONブロックで、発生させた例外を捕まえます。

【例】customer_id0以下の場合はエラーにする

SQL
CREATE OR REPLACE PROCEDURE add_customer (
  c_id IN customer.customer_id%TYPE,
  -- ...他のパラメータ
)
AS
  -- ステップ1: 例外を宣言
  ex_customer_id EXCEPTION; 
BEGIN
  IF c_id <= 0 THEN
    -- ステップ2: 条件を満たさない場合に例外を発生させる
    RAISE ex_customer_id;
  END IF;

  -- 通常のINSERT処理...

EXCEPTION
  -- ステップ3: 発生した例外を捕まえる
  WHEN ex_customer_id THEN
    DBMS_OUTPUT.PUT_LINE('顧客IDは0より大きい値でなければなりません。');
END;
/

このプロシージャをc_id0や負の値を渡して実行すると、ex_customer_idという自作の例外がキャッチされ、エラーメッセージが表示されます。

このように、PL/SQLの例外処理を使いこなすことで、プログラムの信頼性を高め、ユーザーに分かりやすいメッセージを返すことができます。 これで、エラーを恐れることなく、安全なプログラムを書くことができます

前の記事:3. PL/SQL ブロック

次の記事:5. PL/SQL パッケージ