我正在研究oracle 11g。我是oracle的新手,但现在我需要编写一个storedproc。 在我的proc中我删除表并插入表格登台表。删除许多表有完整性约束。如果我在父表中插入后也删除了所有子表,我需要回滚所有子表。
例如:
delete ch1,ch2,ch3;
delete parent;
insert into parent;
rollback ch1,ch2,ch3;
请给我一些解决方案,例如禁用/启用完整性约束或如何使我的交易对我的方案有价值。
答案 0 :(得分: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;
/