2011-03-16 63 views
3

我想删除在已共同的名字添加到每个表的末尾一个例子的表空间某些表:Oracle |删除表

TABLE1_NAME1_COMMON 
TABLE2_NAME2_COMMON 
TABLE3_NAME3_COMMON 

我听说了甲骨文的功能,但我不熟悉多与那些让我我期待着一些帮助。

谢谢。

回答

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; 
/

编辑

  1. 改变现在从user_tables而不是dba_tables选择,因为它似乎更安全的做法。
  2. 中顺序加入set serveroutput ondbms_output.put_line,以便被打印
  3. 添加begin .. exception .. end为要显示的错误。
+0

这给了我一个错误 – Switch 2011-03-16 12:33:56

+0

非常感谢,它的工作就像一个魅力:) :) – Switch 2011-03-16 13:03:51

+0

我可以问这是PL/SQL的东西吗?或功能? – Ascendant 2013-07-24 01:27:46

3

你可以做,在一个过程,但它可能是最好只选择那些DROP -statements,审查这些和手动执行它们:

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; 
0

以确定他们可以使用:

SELECT * FROM user_tables WHERE tablespace_name='MySpace' AND table_name like '%COMMON'; 

然后,您可以使用SELECT来派生您的DROP语句。或者你可以编写一个PL/SQL函数来遍历“公共表”,并使用EXECUTE IMMEDIATE删除它们。

但我会确保你在选择中首先100%确定。