【PL/SQL】偶数・奇数の判定や奇数件のみCOMMITする方法


ここではORACLE社が提供するPL/SQL言語でFOR、LOOP、WHILEで繰り返し処理を制御する方法を紹介しています。

偶数・奇数の判定

MOD関数を使い、式や値を2で割り算した余りを算出することで偶数か奇数の判定を行うことができます。

MOD関数を使った判定方法は次の通りです。

-偶数の判定
MOD(式・値, 2) = 0

--奇数の判定
MOD(式・値, 2) = 1

次の例では1から5までの数値をMOD関数で2で割った余りから奇数か偶数か判定して出力しています。

BEGIN
    FOR i IN 1..5 LOOP
        IF MOD(i,2) = 0 THEN
            DBMS_OUTPUT.PUT_LINE(TO_CHAR(i) || ':偶数');
        ELSIF MOD(i,2) = 1 THEN
            DBMS_OUTPUT.PUT_LINE(TO_CHAR(i) || ':奇数');
        END IF;
    END LOOP;
END;
1:奇数
2:偶数
3:奇数
4:偶数
5:奇数
PL/SQLが実行されました(6 msec.)

偶数件・奇数件のみCOMMITする方法

MOD関数の偶数・奇数判定を活用することで、偶数件または奇数件の処理実行時のみコミットやロールバックを実行することも出きます。

SQL> SELECT * FROM tab1;

レコードが選択されませんでした。

次の例ではFOR文の繰り返し処理の中でINSERT文を実行しています。

このとき処理回数が偶数のときはROLLBACK、奇数のときはCOMMITしています。

あまり普通はこのような書き方はしないと思います。LOOP処理の書き方やスキップ方法(CONTINUE)は別にあります。詳しくは↓で紹介していますので参考にしてください。
>>【PL/SQL】FOR、LOOP、WHILE:繰り返し処理の制御

BEGIN
    FOR i IN 1..5 LOOP
        INSERT INTO tab1 VALUES(i,'test','test',0);
        IF MOD(i,2) = 0 THEN
            ROLLBACK;
        ELSIF MOD(i,2) = 1 THEN
            COMMIT;
        END IF;
    END LOOP;
END;
PL/SQLが実行されました(48 msec.)

処理を実行すると、奇数件のみ登録されています。

SQL> SELECT * FROM tab1;

EMP_ID     EMP_NAME             DEPT              AGE
---------- -------------------- ---------- ----------
1          test                 test                0
3          test                 test                0
5          test                 test                0