Javaと情熱のあいだ

カステラとドーナツと珈琲

Oracleで二回目のオブジェクト一括削除

Oracle10gのDBを使用してて、既にデータが存在するDBにimpコマンドを実行したい時に
こちらのPL/SQLを見てテーブルの一括削除とかやってたんだけど、二回目をやるとハマったのでメモ。

一回目の削除したやつがゴミとしてのこってて二回目に正常削除出来ないらくしてゴミ削除コマンドを追加。

PURGE RECYCLEBIN;
SET SERVEROUTPUT ON SIZE 1000000
DECLARE
CURSOR del_objects_cur
IS
SELECT object_name, object_type
FROM user_objects
WHERE object_type NOT IN ( 'PACKAGE BODY', 'INDEX', 'TABLE' );
CURSOR del_table_cur
IS
SELECT object_name
FROM user_objects
WHERE object_type IN ( 'TABLE' )
AND object_name NOT IN (SELECT table_name
FROM user_indexes
WHERE index_name IN (SELECT r_constraint_name
FROM user_constraints
WHERE constraint_type='R' ));
sql_stmt VARCHAR2(2048);
drop_cnt NUMBER;
BEGIN
FOR cur_rec IN del_objects_cur
LOOP
sql_stmt := 'DROP ' || cur_rec.object_type || ' ' || cur_rec.object_name;
DBMS_OUTPUT.PUT_LINE( '[' || sql_stmt || ']' );
EXECUTE IMMEDIATE sql_stmt;
END LOOP;
LOOP
drop_cnt := 0;
FOR cur_rec IN del_table_cur
LOOP
sql_stmt := 'DROP TABLE ' || cur_rec.object_name;
DBMS_OUTPUT.PUT_LINE( '[' || sql_stmt || ']' );
EXECUTE IMMEDIATE sql_stmt;
drop_cnt := drop_cnt + 1;
END LOOP;
EXIT WHEN drop_cnt = 0;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE( 'EXCEPTION [' || SQLERRM || ']' );
END;