実行・開発環境
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の書き方