我有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;
我可以手动更改,但代码然后膨胀,我真的想控制它一次。:-)此外,表格可能没有顺序标记。提前谢谢。
凯特
答案 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;
/