0

我正在研究 oracle 11g。我对 oracle 完全陌生,但现在我需要编写一个存储过程。在我的过程中,我正在删除表并插入表单暂存表。同时删除许多表具有完整性约束。如果我在插入父表后也删除了所有子表,我需要回滚所有子表。

例如:

delete ch1,ch2,ch3;
delete parent;
insert into parent;
rollback ch1,ch2,ch3;

请给我一些解决方案,例如禁用/启用完整性约束或如何使我的交易对我的场景有价值。

4

1 回答 1

0

如果子表是静态的,那么您可以使用如下查询生成一个脚本来启用和禁用它们:

select 'alter table ' || fk.owner ||'.'|| fk.table_name
  ||' disable constraint '|| fk.constraint_name ||';'
from all_constraints fk
join all_constraints pk
on pk.owner = fk.r_owner
and pk.constraint_name = fk.r_constraint_name
where fk.constraint_type = 'R'
and fk.status = 'ENABLED'
and pk.constraint_type = 'P'
and pk.table_name = '<your parent table>;

这给出了alter table可以在删除/插入之前运行的命令列表,您可以执行相同的操作来创建脚本以重新启用它们。

如果您想在运行中执行此操作,这更有可能是因为您想从存储过程中执行此操作,您可以在游标中执行相同的操作并将其作为动态 SQL 执行:

begin
  for r in (
    select 'alter table ' || fk.owner ||'.'|| fk.table_name
      ||' disable constraint '|| fk.constraint_name as stmt
    from all_constraints fk
    join all_constraints pk
    on pk.owner = fk.r_owner
    and pk.constraint_name = fk.r_constraint_name
    where fk.constraint_type = 'R'
    and fk.status = 'ENABLED'
    and pk.constraint_type = 'P'
    and pk.table_name = 'T42'
    ) loop
    execute immediate r.stmt;
  end loop;
end;
/

两个选项的 SQL Fiddle 演示

于 2013-08-16T08:35:18.967 回答