📝 PL/SQLのエラー処理入門! 例外を使いこなそう
プログラミングをしていると、予期せぬエラーが起こることがあります。たとえば、存在しないデータを探したり、間違った値を入力したり…。
エラーが起こると、プログラムは突然止まってしまいます。これを防ぎ、エラーが起きても graceful(優雅)に処理を続けるために使うのが「例外(Exception)」です。
PL/SQLでは、EXCEPTIONブロックを使って、エラーを捕まえて、適切な対応をすることができます。
1. 例外って何? 🧐
例外とは、プログラムの実行中に発生するエラーのことです。PL/SQLには、あらかじめ用意された例外と、自分で作る例外の2種類があります。
① システム定義の例外
Oracleが最初から用意しているエラーのことです。例えば、以下のようなものがあります。
NO_DATA_FOUND:SELECT文でデータが見つからなかったときTOO_MANY_ROWS:SELECT INTO文で複数のデータが見つかったとき
これらの例外は、名前をそのまま使ってエラーを捕まえることができます。
② ユーザー定義の例外
ビジネス上の特別なルールに違反したときに、自分でエラーを発生させたい場合に作ります。例えば、「顧客IDは0より大きい値でなければならない」といったルールです。
2. 例外処理の基本構造 🧱
PL/SQLのEXCEPTIONブロックは、BEGINブロックの後に配置します。
【構文】
BEGIN
-- ここに通常の処理を書く
EXCEPTION
WHEN 例外名1 THEN
-- 例外1が発生したときの処理
WHEN 例外名2 THEN
-- 例外2が発生したときの処理
WHEN OTHERS THEN
-- 上記以外の、その他のエラーが発生したときの処理
END;
/
WHEN OTHERS THEN は、予期せぬエラーをすべてキャッチしてくれる非常に便利な機能です。
3. システム定義の例外を使ってみよう! 🎣
ここでは、SELECT INTO文で発生しやすい2つの例外を例に、使い方を見ていきましょう。
【エラーをキャッチするコード】
-- `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つのステップ】
例外の宣言:
DECLAREブロックで例外を宣言します。例外名 EXCEPTION;
例外の発生:
RAISE文を使って、任意の場所で例外を発生させます。RAISE 例外名;
例外の捕捉:
EXCEPTIONブロックで、発生させた例外を捕まえます。
【例】customer_idが0以下の場合はエラーにする
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_idに0や負の値を渡して実行すると、ex_customer_idという自作の例外がキャッチされ、エラーメッセージが表示されます。
このように、PL/SQLの例外処理を使いこなすことで、プログラムの信頼性を高め、ユーザーに分かりやすいメッセージを返すことができます。 これで、エラーを恐れることなく、安全なプログラムを書くことができます
