【PL/SQL】INSERT,UPDATE,DELETE件数の取得方法


ここではORACLE社が提供するPL/SQL言語でINSERT,UPDATE,DELETEの処理件数を取得する方法を紹介しています。

INSERT,UPDATE,DELETE件数の取得方法

PL/SQL言語でINSERT,UPDATE,DELETEを実行すると、内部的にカーソル処理(暗黙カーソル)に変換されて実行されています。

このとき処理件数はROWCOUNTという属性に格納されるので、これを取得します。

INSERTの処理件数の取得

INSERT文の処理結果は「SQL%ROWCOUNT」で取得できます。

BEGIN
    INSERT INTO tab1 VALUES('00001','Suzuki','D0001',28);
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    COMMIT;
END;
1
PL/SQLが実行されました(6 msec.)

「SQL%ROWCOUNT」には直前のSQLの処理結果が格納されるため、INSERT文を3行並べて書いた場合は、1という結果が返ってきます。

BEGIN
    INSERT INTO tab1 VALUES('00001','Suzuki','D0001',28);
    INSERT INTO tab1 VALUES('00002','Tanaka','D0002',25);
    INSERT INTO tab1 VALUES('00003','Kizaki','D0002',35);
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    COMMIT;
END;
1
PL/SQLが実行されました(21 msec.)

複数行のINSERT文はINSERT ALLを使うことで1文にすれば、処理件数を取得することが出来ます。

INSERT文の詳しい書き方は↓で紹介していますので参考にしてください。
>>【SQL】INSERT文の書き方:サンプル多数あり

BEGIN
    INSERT ALL 
        INTO tab1 VALUES('00001','Suzuki','D0001',28)
        INTO tab1 VALUES('00002','Tanaka','D0002',25)
        INTO tab1 VALUES('00003','Kizaki','D0002',35)
    SELECT * FROM dual;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    COMMIT;
END;
3
PL/SQLが実行されました(6 msec.)

UPDATEの処理件数の取得

UPDATE文の処理結果は「SQL%ROWCOUNT」で取得できます。

BEGIN
    UPDATE tab1 SET age = 99;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    COMMIT;
END;
3
PL/SQLが実行されました(21 msec.)

DELETEの処理件数の取得

DELETE文の処理結果は「SQL%ROWCOUNT」で取得できます。

BEGIN
    DELETE FROM tab1;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    COMMIT;
END;
3
PL/SQLが実行されました(22 msec.)

0件エラーの実装

「SQL%ROWCOUNT」を使うことで、SQLの処理結果が0件の場合のエラー処理などを実装することもできます。

次の例では、UPDATE文の結果が0件の場合にエラーメッセージを表示しています。

BEGIN
    UPDATE tab1 SET age = 99 WHERE 0 = 1;
    IF SQL%ROWCOUNT = 0 THEN 
        DBMS_OUTPUT.PUT_LINE('ERROR');
    END IF;
    COMMIT;
END;
ERROR
PL/SQLが実行されました(53 msec.)

注意点:COMMIT後は取得できない

「SQL%ROWCOUNT」には直前で実行されたSQLの処理結果がで取得できます。

次の例のようにコミットした後はクリアされ0となるので注意が必要です。

BEGIN
    INSERT INTO tab1 VALUES('00001','Suzuki','D0001',28);
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    COMMIT;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
END;
1
0
PL/SQLが実行されました(6 msec.)