如何从Oracle中的模式中删除表的列表?

时间:2011-09-27 11:34:20

标签: sql oracle oracle10g

我的Oracle scott架构包含类似的表列表

'prefix_A'
'prefix_B'
'prefix_C'
'A'
'B'
'C'

现在我想删除表的列表,包含像'Prefix _'这样的表前缀,但是其他表A,B,C将保持不变。

怎么可能?

先谢谢。

2 个答案:

答案 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;