sknt

4歩進んで5歩戻る

PL/SQLによる全テーブルデータの削除 - コード

実行・開発環境

Oracle Express Edition 11.2.0.2.0

PL/SQL呼び出しコード - StartSQL.bat

pushd %0\..
sqlplus TESTUSER1/P @sql\TrunTable.sql
pause

PL/SQLコード1(エラー)- sql/TrunTable.sql

DECLARE
CURSOR c1 IS
  SELECT TABLE_NAME FROM USER_TABLES;
vName VARCHAR2(200);
vSql VARCHAR2(200);
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 INTO vName;
    EXIT WHEN C1%NOTFOUND;
      vSql := 'TRUNCATE TABLE :1';
      DBMS_OUTPUT.PUT_LINE('vSql = '|| vSql);
      EXECUTE IMMEDIATE vSql USING IN vName;
  END LOOP;
  CLOSE c1;
END;
/
exit;

始めはバインド変数で書いていましたが、エラー「ORA-00903: 表名が無効です。」が発生しました。
調べたところ、プレースフォルダであるダミーのバインド変数は、テーブル名と列名は参照できませんでした。

PL/SQLコード2 - sql/TrunTable.sql

DECLARE
CURSOR c1 IS
  SELECT TABLE_NAME FROM USER_TABLES;
vName VARCHAR2(200);
vSql VARCHAR2(200);
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 INTO vName;
    EXIT WHEN C1%NOTFOUND;
      vSql := 'TRUNCATE TABLE ' || vName;
      DBMS_OUTPUT.PUT_LINE('vSql = '|| vSql);
      EXECUTE IMMEDIATE vSql;
  END LOOP;
  CLOSE c1;
END;
/

* その他参考サイト
- PL/SQLの書き方