我的Oracle scott架构包含类似的表列表
'prefix_A'
'prefix_B'
'prefix_C'
'A'
'B'
'C'
现在我想删除表的列表,包含像'Prefix _'这样的表前缀,但是其他表A,B,C将保持不变。
怎么可能?
先谢谢。
答案 0 :(得分:7)
使用动态SQL驱动数据字典。
begin
for trec in ( select table_name
from user_tables
where table_name like 'PREFIX\_%' escape `\' )
loop
dbms_output.put_line('dropping table ' || trec.table_name);
execute immediate 'drop table '||trec.table_name;
end loop;
end;
精确地使用LIKE子句是个好主意;使用escape
关键字确保下划线不被视为通配符。或者使用substr(table_name, 1, 7) = 'PREFIX_'
。
如果您正在使用10g或更高版本以及the RECYCLE BIN is enabled,则删除错误的表不是灾难,但最好不要这样做。显然你不会在Production中运行这样的代码,但是你会使用这个原理来生成drop语句的脚本。
上面的代码不处理依赖项。如果您有引用前缀表的外键并且您想强制删除表,请使用以下附加逻辑:
execute immediate 'drop table '|| trec.table_name ||' cascade constraint';
这会丢弃外键约束,但会保留(以前)依赖表。
答案 1 :(得分:0)
我用它来禁用约束,删除约束并删除表。
-- disable constraints on tables
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND t.table_name like 'WF_%'
AND c.status = 'ENABLED'
ORDER BY c.constraint_type DESC)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
END LOOP;
END;
-- drop the constraints
begin
for r in ( select table_name, constraint_name
from user_constraints where
table_name like 'WF_%' )
loop
execute immediate 'alter table '||r.table_name
||' drop constraint '||r.constraint_name;
end loop;
end loop;
-- drop the tables
begin
for trec in ( select table_name
from user_tables
where table_name like 'WF_%' )
loop
execute immediate 'drop table '||trec.table_name|| ' purge';
end loop;
end;