-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathF_CASCADE_UPDATE.sql
122 lines (97 loc) · 5.28 KB
/
F_CASCADE_UPDATE.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
create or replace type T_STRING_LIST as table of varchar2( 32000 );
/
create or replace function F_CASCADE_UPDATE ( I_TABLE_NAME in varchar2
, I_COLUMN_NAME in varchar2
, I_OLD_VALUE in varchar2
, I_NEW_VALUE in varchar2
) return T_STRING_LIST is
/* ********************************************************************************************************
History of changes
yyyy.mm.dd | Version | Author | Changes
-----------+---------+----------------+-------------------------
2017.01.06 | 1.0 | Ferenc Toth | Created
******************************************************************************************************** */
V_CONSTS_D T_STRING_LIST := T_STRING_LIST();
V_CONSTS_E T_STRING_LIST := T_STRING_LIST();
V_UPDATES T_STRING_LIST := T_STRING_LIST();
V_RESULT T_STRING_LIST := T_STRING_LIST();
V_COLUMN_NAME varchar2( 500 );
begin
V_CONSTS_D.extend;
V_CONSTS_D( V_CONSTS_D.count ) := '/* Disable Foreign key constraints */';
V_UPDATES.extend;
V_UPDATES( V_UPDATES.count ) := '/* Replace the value */';
V_CONSTS_E.extend;
V_CONSTS_E( V_CONSTS_E.count ) := '/* Enable Foreign key constraints */';
for L_R in ( select UC.TABLE_NAME
, DBC.COLUMN_NAME
, UC.CONSTRAINT_NAME
from USER_CONSTRAINTS UC
, USER_CONS_COLUMNS DBC
where UC.CONSTRAINT_TYPE = 'R'
and UC.STATUS = 'ENABLED'
and DBC.CONSTRAINT_NAME = UC.CONSTRAINT_NAME
and R_CONSTRAINT_NAME in ( select UCB.CONSTRAINT_NAME
from USER_CONSTRAINTS UCB
, USER_CONS_COLUMNS DBCB
where DBCB.CONSTRAINT_NAME = UCB.CONSTRAINT_NAME
and UCB.TABLE_NAME = upper( I_TABLE_NAME )
and DBCB.COLUMN_NAME = upper( I_COLUMN_NAME )
)
order by 1,2
)
loop
V_CONSTS_D.extend;
V_CONSTS_D( V_CONSTS_D.count ) := 'ALTER TABLE '||L_R.TABLE_NAME||' DISABLE CONSTRAINT '||L_R.CONSTRAINT_NAME||';';
V_CONSTS_E.extend;
V_CONSTS_E( V_CONSTS_E.count ) := 'ALTER TABLE '||L_R.TABLE_NAME||' ENABLE CONSTRAINT '||L_R.CONSTRAINT_NAME||';';
V_UPDATES.extend;
V_UPDATES( V_UPDATES.count ) := 'UPDATE '||L_R.TABLE_NAME||' SET '||L_R.COLUMN_NAME||'='''||I_NEW_VALUE||''' where '||L_R.COLUMN_NAME||'='''||I_OLD_VALUE||''';';
end loop;
V_UPDATES.extend;
V_UPDATES( V_UPDATES.count ) := 'UPDATE '||I_TABLE_NAME||' SET '||I_COLUMN_NAME||'='''||I_NEW_VALUE||''' where '||I_COLUMN_NAME||'='''||I_OLD_VALUE||''';';
for L_I in 1..V_CONSTS_D.count
loop
V_RESULT.extend;
V_RESULT( V_RESULT.count ) := V_CONSTS_D( L_I );
end loop;
for L_I in 1..V_UPDATES.count
loop
V_RESULT.extend;
V_RESULT( V_RESULT.count ) := V_UPDATES( L_I );
end loop;
for L_I in 1..V_CONSTS_E.count
loop
V_RESULT.extend;
V_RESULT( V_RESULT.count ) := V_CONSTS_E( L_I );
end loop;
V_RESULT.extend;
V_RESULT( V_RESULT.count ) := '/* ...Some more suspicious place */';
V_COLUMN_NAME := upper( I_TABLE_NAME||'_'||I_COLUMN_NAME );
for L_R in ( select table_name
from user_tab_columns
where column_name = V_COLUMN_NAME
and table_name in (select ut.table_name from user_tables ut )
and upper ( 'UPDATE '||table_name||' SET '||V_COLUMN_NAME||'='''||I_NEW_VALUE||''' where '||V_COLUMN_NAME||'='''||I_OLD_VALUE||''';' ) not in ( select * from table( V_UPDATES ) )
)
loop
V_RESULT.extend;
V_RESULT( V_RESULT.count ) := 'UPDATE '||L_R.TABLE_NAME||' SET '||V_COLUMN_NAME||'='''||I_NEW_VALUE||''' where '||V_COLUMN_NAME||'='''||I_OLD_VALUE||''';';
end loop;
-- standard singular from plural
if substr( upper (I_TABLE_NAME) , -1 ) = 'S' then
V_COLUMN_NAME := upper( substr( I_TABLE_NAME,1,length(I_TABLE_NAME)-1)||'_'||I_COLUMN_NAME );
for L_R in ( select table_name
from user_tab_columns
where column_name = V_COLUMN_NAME
and table_name in (select table_name from user_tables )
and upper ( 'UPDATE '||table_name||' SET '||V_COLUMN_NAME||'='''||I_NEW_VALUE||''' where '||V_COLUMN_NAME||'='''||I_OLD_VALUE||''';' ) not in ( select * from table( V_UPDATES ) )
)
loop
V_RESULT.extend;
V_RESULT( V_RESULT.count ) := 'UPDATE '||L_R.TABLE_NAME||' SET '||V_COLUMN_NAME||'='''||I_NEW_VALUE||''' where '||V_COLUMN_NAME||'='''||I_OLD_VALUE||''';';
end loop;
end if;
return V_RESULT;
end;
/