我正在研究 oracle 11g。我对 oracle 完全陌生,但现在我需要编写一个存储过程。在我的过程中,我正在删除表并插入表单暂存表。同时删除许多表具有完整性约束。如果我在插入父表后也删除了所有子表,我需要回滚所有子表。
例如:
delete ch1,ch2,ch3;
delete parent;
insert into parent;
rollback ch1,ch2,ch3;
请给我一些解决方案,例如禁用/启用完整性约束或如何使我的交易对我的场景有价值。
如果子表是静态的,那么您可以使用如下查询生成一个脚本来启用和禁用它们:
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;
/