2013-11-22 34 views

回答

25

您可以使用短的匿名块来完成此操作。

BEGIN 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%') 
    LOOP 
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name; 
    END LOOP; 
END; 
+1

还包括“级联约束”,以便在涉及外键时删除这些表的顺序不会成为问题。 – talek

6

只有一条语句是不可能的。通常,我写一个sql来获取所有表格,然后执行结果:

select 'drop table ' || table_name || ';' 
from user_tables 
where table_name like 'EXT_%'; 
+2

复制全部并执行它们可以很容易与这一个。选择'drop table'|| table_name || '; 'from user_tables where table_name like'EXT_%'; –

+0

是的,这就是我的意思。执行此查询,复制/粘贴结果并执行语句。 –

2

该代码不仅会删除EXT_%表,还会作为DROP EXT%。 下划线是作为特殊的通配符,充当'%',但对于单个字符。

BEGIN 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%') 
    LOOP 
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name; 
    END LOOP; 
END; 

为了达到预期的效果,你应该改变方式如下

​​

逃脱下划线字符,以便您的代码从字面上trated,ESCAPE“\”修饰符指示转义字符是'\'

1

在大多数情况下,您会发现违反约束。在这种情况下,这个脚本可以帮助你:

DECLARE 
    c_action CONSTANT VARCHAR2(10) := 'DROP'; 
BEGIN 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%') 
    LOOP 

     FOR reg IN (SELECT uc.table_name, 
         uc.constraint_name 
       FROM user_constraints uc 
       WHERE uc.table_name IN (c.table_name)) LOOP 
      EXECUTE IMMEDIATE 'ALTER TABLE ' || reg.table_name || ' ' || c_action || 
         ' CONSTRAINT ' || reg.constraint_name ; 
      END LOOP; 

    END LOOP; 
COMMIT; 
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%') 
    LOOP 

      EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || c.table_name; 
      EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name; 
    END LOOP; 

END; 
相关问题