DROP在Oracle SQL中以“EXT_”开头的所有表

时间:2013-11-22 09:34:07

标签: sql oracle

我知道这个问题可能会问很多次,但我找不到一行SQL语句。 我记得我之前做过但现在我不记得我是怎么做的了

我想删除名称以“EXT_”开头的所有表。是否有可能通过一行SQL语句实现它。

4 个答案:

答案 0 :(得分:31)

您可以使用简短的匿名阻止来执行此操作。

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 :(得分:7)

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

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

答案 2 :(得分:2)

此代码不仅会对EXT_%表进行DROP,而且还会充当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;

为了达到预期的效果,您应该按照以下方式更改代码

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

转义下划线字符以便按字面意义进行交易, ESCAPE' \' 修饰符表示转义字符&#39 ; \'

答案 3 :(得分: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;