PL/SQL プログラミング入門(1) > PL/SQL から DDL を実行する

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 を実行すると、暗黙コミット が発生する。そのために先行するトランザクションがある場合には ロールバック できなくなってしまう。



関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト