ali*_*ani 3 oracle oracle-11g plsql cascade
更新主键时是否可以更新Oracle中所有引用的外键?
像这样的过程,获取表名和主键,查找所有表中的所有外键,并使用新值更新它
PROCEDURE cascade_update_primary(
table_name IN VARCHAR2,
primary_column IN Number,
new_value IN Number);
Run Code Online (Sandbox Code Playgroud)
甲骨文不支持ON UPDATE CASCADE
。
具有DEFERRABLE
外键约束:
create or replace procedure cascade_update_primary
(
p_table_name in varchar2,
p_old_value in number,
p_new_value in number
)
as
l_column_name varchar2(128 char);
begin
select
cc.column_name into l_column_name
from
user_cons_columns cc
join user_constraints c on (c.constraint_name = cc.constraint_name)
where
c.constraint_type = 'P' and c.table_name = p_table_name
;
execute immediate 'set constraints all deferred';
execute immediate 'update "' || p_table_name || '" set "' || l_column_name ||
'" = :B1 where "' || l_column_name || '" = :B2' using p_new_value, p_old_value;
for c in (
select
cc2.table_name, cc2.column_name
from
user_cons_columns cc
join user_constraints c on (c.constraint_name = cc.constraint_name)
join user_constraints c2 on (c.constraint_name = c2.r_constraint_name)
join user_cons_columns cc2 on (c2.constraint_name = cc2.constraint_name)
where
c.constraint_type = 'P' and c.table_name = p_table_name
and cc.column_name = l_column_name
)
loop
execute immediate 'update "' || c.table_name || '" set "' || c.column_name ||
'" = :B1 where "' || l_column_name || '" = :B2' using p_new_value, p_old_value;
end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)
对于NOT DEFERRABLE
外键,进行一些修改:
归档时间: |
|
查看次数: |
10807 次 |
最近记录: |