PL/SQL から TRUNCATE TABLE を行なう
TRUNCATE TABLE は DELETE と異なり DDL であるため PL/SQL に直接埋め込みSQLとして実行できない。
それぞれの特徴については TRUNCATE と DELETE の違い 参照
テーブル定義
テーブルは PLSQL による INSERT のテーブル定義を使用
PL/SQL に直接 TRUNCATE TABLE を書いてみると…
以下のメッセージのようにコンパイラとしては 'TRUNCATE' が ステートメントとしてではなく変数、関数、スキーマなどである事を要求していると察することができる。
SQL> CREATE OR REPLACE PROCEDURE RIVUS.DDL_TRUNCATE_NG
2 IS BEGIN
3 TRUNCATE TABLE USER_MASTER;
4 END;
5 /
警告: プロシージャが作成されましたが、コンパイル・エラーがあります。
SQL> show errors
PROCEDURE RIVUS.DDL_TRUNCATE_NGのエラーです。
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/11 PLS-00103: 記号"TABLE"が見つかりました。
次のうちの1つが入るとき:
:= .
( @ % ;
記号":= が続行のために"TABLE"の前に挿入されました。
PL/SQL で TRUNCATE TABLE を実行する
SQL> CREATE OR REPLACE PROCEDURE RIVUS.DDL_TRUNCATE
2 IS
3 vUserID USER_MASTER.USER_ID%TYPE;
4 vUserName USER_MASTER.USER_NAME%TYPE;
5 BEGIN
6 EXECUTE IMMEDIATE 'TRUNCATE TABLE USER_MASTER';
7
8 INSERT INTO USER_MASTER (USER_ID, DEPT_NO, USER_NAME)
9 VALUES ('0022', '1001','安倍 晋二');
10
11 SELECT USER_ID, USER_NAME INTO vUserID, vUserName FROM USER_MASTER;
12 DBMS_OUTPUT.PUT_LINE('利用者IDは' || vUserID || 'です。');
13 DBMS_OUTPUT.PUT_LINE('利用者名は' || vUserName || 'さんです。');
14 END;
15 /
プロシージャが作成されました。
SQL> set serveroutput on
SQL> execute ddl_truncate;
利用者IDは0022です。
利用者名は安倍 晋二さんです。
PL/SQLプロシージャが正常に完了しました。
PL/SQL から DDL を使用するときの注意点
PL/SQL から 動的SQL を用いて DDL を実行すると、暗黙コミット が発生する。そのために先行するトランザクションがある場合には ロールバック できなくなってしまう。
関連事項