【PL/SQL】Oracle PL/SQL入門【第6回 例外処理のはなし】

2021年2月5日

PL/SQL入門 例外処理を書いてみよう

前回までINSERT文を書いて来ましたが、エラーが発生した場合はどうなるのでしょうか。
INSERTの後に「COMMIT」を書いていましたが、
エラーが発生した場合「ROLLBACK」はどう書けば良いのでしょうか。
と言う内容の第6回目です。

STEP1. EXCEPTION 例外処理を記述してみよう

さっそく、テキストエディタでPL/SQLをコーディングしてみます。
下記の内容をエディタで記述しテキストとして保存して下さい。
ここでは、「6.sql」ファイルとして保存しました。

CREATE OR REPLACE PROCEDURE TEST6 IS
BEGIN
    FOR I IN REVERSE 10..15
    LOOP
        INSERT INTO TBL_TEST VALUES(I, 'TEST' || TO_CHAR(I), I * 100);
    END LOOP;
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END;
/
show errors

STEP2. 処理をコンパイルして実行してみよう

STEP1.のソースをコンパイル ⇒ 実行してみましょう。
エラーが発生したと思います。

STEP3. ソースの説明

CREATE OR REPLACE PROCEDURE TEST6 IS
BEGIN
    FOR I IN REVERSE 10..15
    LOOP
        INSERT INTO TBL_TEST VALUES(I, 'TEST' || TO_CHAR(I), I * 100);
    END LOOP;
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END;
/
show errors

■3行目:FOR I IN REVERSE 10..15
通常の「FOR」文と違い、REVERSEが付いています。
ループしている間、ループ変数が、15 ⇒ 14 ⇒ 13 ⇒ 12 ・・・・・ の順番で変わっていきます。
今回の場合は、IDが15から降順にINSERTを実行して行き、IDが10のレコードをINSERTした時点で一意制約のエラーが発生してます。(第5回目でIDが10のレコードを挿入済の為)

■8行目:EXCEPTION
「EXCEPTION」の記述から下が例外処理部となります。
今回の場合は、INSERTで一意制約が発生した時点でこの箇所に飛んできます。

■9行目 : WHEN OTHERS THEN
トラップするエラーの種類を指定します。 WHEN ~ THEN
OTHERS を指定すると、その他全部をトラップします。

■10行目:ROLLBACK;
言わずと知れた「ROLLBACK」です。

■11行目:RAISE;
発生したエラーを上部に波及させます。
実行をしたSQL*Plusの画面に「一意制約に反しています」が表示されているは、この「RAISE」の記述がある為です。
もし、「RAISE」を書かなかった場合、SQL*Plusの画面にはエラーが表示されません
(正常終了した様に見えます)

補足 PL/SQLのブロック構造

上で例外処理部がでてきたので、ついでにPL/SQLのブロック構造を書いておきたいと思います。

CREATE OR REPLACE PROCEDURE TEST6 IS
    //宣言部
BEGIN
    //実行部
    NULL;
EXCEPTION //例外処理部
    WHEN OTHERS THEN
        NULL;
END;

PL/SQLのブロック構造には、「宣言部」、「実行部」、「例外処理部」があります。
5回目までで「実行部」、今回の6回目で「例外処理部」がでてきました。
「宣言部」は、変数等の使用するオブジェクトの定義(宣言)をする箇所です。
次回以降、紹介して行くのでお楽しみに!

記事を読む Oracle PL/SQL入門【第7回 処理分岐してみよう】

【PL/SQL】メニュー

サイトマップ

2021年2月5日Oracle,PL/SQL,データベース,プログラムPL/SQL入門

Posted by こっぷ