如何使用Oracle遍历一个公共列的所有表并删除匹配的所有记录

okxuctiv  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(98)

我有一个Oracle SQL语句,它可以获取多个表中出现的某个列的所有表。

select owner, table_name from all_tab_columns 
where column_name = 'DOCUMENT_ID' 
order by table_name;

现在,我想添加删除功能,该功能将删除DOCUMENT_ID = 1的所有表中的所有记录
我不想一次做一张table,因为有很多,接近30张。
更新:在我的评论中,如果有一个FOREIGN KEY ID -例如,我要删除的记录有一个子记录,该怎么办
让我们以循环记录为例,如下面的伟大解决方案所示。
假设DOCTYPE_ID出现在document_id= 1的记录中。DOCTYPE_ID= 123。因此,我需要搜索所有其他表或DOCTYPE_ID= 123的表,并删除所有这些行。
数据库中只有31个表,这是永远不会改变的

yebdmbv4

yebdmbv41#

使用EXECUTE IMMEDIATE生成所需的动态DML:

BEGIN
  FOR rec_table IN (SELECT owner,table_name
                      FROM all_tab_columns
                     WHERE column_name = 'DOCUMENT_ID')
  LOOP
    EXECUTE IMMEDIATE 'DELETE FROM "'||rec_table.owner||'"."'||rec_table.table_name||'" WHERE document_id = 1';
    COMMIT;
  END LOOP;
END;

请记住,您显然需要对所有这些表都具有删除权限才能使其工作。我还建议在OWNER上构建某种过滤器,以防止访问您不希望访问的表。

更新

您的问题已更新,以反映遵循外键关系从子表中删除行的需要。如果这就是问题所在,您不需要编写任何特殊代码。只需使用ON DELETE CASCADE选项定义您的外键,如果父项被删除,则以这种方式定义外键的子项将被自动删除。这不是你应该自己编写代码的东西。

相关问题