我有一个名为BILL的模式,在这个模式中,所有表都有一个名为ID的列。我需要一种方法来删除所有表中的行,其中ID ='test'。有很多模式,所以我只从BILL中删除它们很重要。如果重要的话,有些表也不包含测试行。这是一个oracle数据库。
我无法弄清楚如何使用sql执行此操作。也许pl / sql?有什么想法吗?
答案 0 :(得分:3)
我选择execute immediate
:
begin
for t in (select table_name from dba_tables where owner = 'BILL') loop
execute immediate 'delete from ' || t.table_name ||
' where id = ''test''';
end loop;
end;
/
如果该模式中的所有表都具有名为id
的列名(如您所指示的那样),则此方法应该有效。否则,您应该与dba_tab_columns
一起加入,以确保只选择具有此类列的表。
如果id
是其他表引用的主键,它也会失败。在这种情况下,您可以将execute immediate
嵌入到
begin
execute immediate '....';
exception when others then
dbms_output.put_line('failed to delete in ' || t.table_name);
end;