Oracle SQL:重复多个表的进程

时间:2015-01-21 08:46:48

标签: sql loops oracle11g

我有Oracle 11g。我想循环使用#39;这个代码通过多个表t1已经存在,但我需要为4个表(t1,t2,t3和t4)执行此操作:

BEGIN
 EXECUTE IMMEDIATE 'TRUNCATE TABLE t1';
 EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION WHEN OTHERS THEN 
  IF SQLCODE !=-942 THEN
    RAISE;
  END IF;
END;

我可以手动更改,但代码然后膨胀,我真的想控制它一次。:-)此外,表格可能没有顺序标记。提前谢谢。

凯特

2 个答案:

答案 0 :(得分:1)

创建一个循环,从中选择双重表名。您还可以拥有一个包含名称的表格,并从中进行选择。

BEGIN
 for t in 
   (
     select 't1' as table_name from dual 
     union all 
     select 't2' as table_name from dual 
     union all 
     select 't3' as table_name from dual 
     union all 
     select 't4' as table_name from dual 
    )
  loop
    EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || t.table_name;
    EXECUTE IMMEDIATE 'DROP TABLE ' || t.table_name;
  end loop;
EXCEPTION WHEN OTHERS THEN 
  IF SQLCODE !=-942 THEN
    RAISE;
  END IF;
END;

答案 1 :(得分:1)

删除之前无需truncate表,因此drop table就足够了。另外,我添加purge修饰符,以免混乱回收站。

begin
  for t in (select table_name from user_tables
             where regexp_like(table_name, '^T[1-4]$')) loop

     execute immediate 'drop table ' || t.table_name || ' purge';

  end loop;
end;
/

当然,您可以按特定程序删除表格:

declare
   procedure drop_table(t in varchar2) is begin
     execute immediate 'drop table ' || t || ' purge';
   exception when others then
      if sqlcode != -942 then
         raise;
      end if;
   end drop_table;

begin
   drop_table('T1');
   drop_table('T2');
   drop_table('T3');
   drop_table('T4');
end;
/