我想删除一个表空间中的某些表,这些表的公共名称附加到每个表的末尾,例如:
TABLE1_NAME1_COMMON
TABLE2_NAME2_COMMON
TABLE3_NAME3_COMMON
我听说过Oracle功能,但我对这些功能并不熟悉,所以我期待得到一些帮助。
感谢。
答案 0 :(得分:9)
如果你完全确定自己在做什么,也就是说,如果你确定不小心放下一张你不想放弃的桌子,你可以这样做:
set serveroutput on size 1000000
begin
for r in (
select table_name
from user_tables
where table_name like '%\_COMMON' escape '\')
loop
execute immediate 'drop table ' || r.table_name;
end loop;
exception when others then
dbms_output.put_line(sqlerrm);
end;
/
修改:
user_tables
而不是dba_tables
进行选择,因为它似乎更安全。set serveroutput on
以便打印dbms_output.put_line
begin .. exception .. end
以便显示错误。答案 1 :(得分:3)
您可以在一个程序中执行此操作,但最好只选择那些DROP
- 语句,查看并手动执行它们:
SELECT 'DROP TABLE ' || table_name || ';'
FROM user_tables
WHERE table_name LIKE '%\_COMMON' ESCAPE '\';
将返回
DROP TABLE TABLE1_NAME1_COMMON;
DROP TABLE TABLE2_NAME2_COMMON;
DROP TABLE TABLE3_NAME3_COMMON;
答案 2 :(得分:0)
识别它们你可以使用:
SELECT * FROM user_tables WHERE tablespace_name='MySpace' AND table_name like '%COMMON';
然后,您可以使用SELECT派生DROP语句。或者你可以编写一个PL / SQL函数来遍历“公共表”并使用EXECUTE IMMEDIATE对它们进行DROP。
我会确保你首先在选择中100%确定。