-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path09loc_create_rule_proc_package.txt
More file actions
305 lines (282 loc) · 17.4 KB
/
Copy path09loc_create_rule_proc_package.txt
File metadata and controls
305 lines (282 loc) · 17.4 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
DECLARE
v_tab CHAR := chr(9);
v_line_break VARCHAR2(2 CHAR) := chr(10);
v_main_dataowner VARCHAR2(255 CHAR); --Defaults to CURRENT_SCHEMA if left empty
v_main_tbl VARCHAR2(255 CHAR) := 'WEIRDO_TBL';
v_rule_dataowner VARCHAR2(255 CHAR); --Defaults to v_main_dataowner if left empty
v_rule_tbl VARCHAR2(255 CHAR) := v_main_tbl || '_DH_RULE_TBL';
v_rule_priority_col_name VARCHAR(255 CHAR) := 'PRIORITY_LBH';
v_rule_priority_datatype VARCHAR2(255 CHAR);
v_rule_log_dataowner VARCHAR2(255 CHAR); --Defaults to v_main_dataowner if left empty
v_rule_log_tbl VARCHAR2(255 CHAR) := v_main_tbl || '_DH_RULE_LOG_TBL';
v_rule_pckg_dataowner VARCHAR2(255 CHAR); --Defaults to v_main_dataowner if left empty
v_rule_pckg VARCHAR2(255 CHAR) := v_main_tbl || '_DH_RULE_PCKG';
v_rule_log_start_proc_name VARCHAR2(255 CHAR) := v_main_tbl || '_DH_RULE_LOG_ST';
v_rule_log_end_proc_name VARCHAR2(255 CHAR) := v_main_tbl || '_DH_RULE_LOG_END';
v_app_proc_name VARCHAR2(255 CHAR) := v_main_tbl || '_DH_RULE_APP';
v_app_proc_commit_threshold INTEGER := 2; --0 for one commit after loop, 1 for regular commits
v_sql_stmt_main_commit_clause CLOB;
v_sql_stmt_final_commit_clause CLOB;
v_sql_stmt CLOB;
BEGIN
IF v_main_dataowner IS NULL
THEN
SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') INTO v_main_dataowner FROM dual;
END IF;
IF v_rule_dataowner IS NULL
THEN
v_rule_dataowner := v_main_dataowner;
END IF;
IF v_rule_log_dataowner IS NULL
THEN
v_rule_log_dataowner := v_main_dataowner;
END IF;
IF v_rule_pckg_dataowner IS NULL
THEN
v_rule_pckg_dataowner := v_main_dataowner;
END IF;
IF v_rule_priority_datatype IS NULL
THEN
--Thank you, https://stackoverflow.com/a/54955439
SELECT ATB."DATA_TYPE" ||
CASE
WHEN ATB."DATA_PRECISION" IS NOT NULL AND NVL (ATB."DATA_SCALE", 0) > 0
THEN '(' || ATB."DATA_PRECISION" || ',' || ATB."DATA_SCALE" || ')'
WHEN ATB."DATA_PRECISION" IS NOT NULL AND NVL (ATB."DATA_SCALE", 0) = 0
THEN '(' || ATB."DATA_PRECISION" || ')'
WHEN ATB."DATA_PRECISION" IS NULL AND ATB."DATA_SCALE" IS NOT NULL
THEN '(*,' || ATB."DATA_SCALE" || ')'
WHEN ATB."CHAR_LENGTH" > 0
THEN '(' || ATB."CHAR_LENGTH" ||
CASE ATB."CHAR_USED"
WHEN 'B' THEN ' BYTE'
WHEN 'C' THEN ' CHAR'
ELSE NULL
END || ')'
END
INTO v_rule_priority_datatype FROM ALL_TAB_COLUMNS ATB
WHERE ATB."OWNER" = v_rule_dataowner AND ATB."TABLE_NAME" = v_rule_tbl AND ATB."COLUMN_NAME" = v_rule_priority_col_name;
END IF;
IF v_app_proc_commit_threshold < 1
THEN
v_sql_stmt_main_commit_clause := NULL;
v_sql_stmt_final_commit_clause := v_tab || v_tab || 'COMMIT;' || v_line_break
|| v_tab || v_tab || 'v_last_commit_rule_oid := v_current_rule_oid;' || v_line_break
|| v_line_break;
ELSIF v_app_proc_commit_threshold = 1
THEN
v_sql_stmt_main_commit_clause := v_tab || v_tab || v_tab || v_tab || 'COMMIT;' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'v_last_commit_rule_oid := v_current_rule_oid;' || v_line_break
|| v_line_break;
v_sql_stmt_final_commit_clause := NULL;
ELSE
v_sql_stmt_main_commit_clause := v_tab || v_tab || v_tab || v_tab || 'v_loop_counter := v_loop_counter + 1;' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'IF v_loop_counter = ' || v_app_proc_commit_threshold || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || v_tab || 'COMMIT;' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || v_tab || 'v_loop_counter := 0;' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || v_tab || 'v_last_commit_rule_oid := v_current_rule_oid;' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'END IF;' || v_line_break
|| v_line_break;
v_sql_stmt_final_commit_clause := v_tab || v_tab || 'IF v_loop_counter > 0' || v_line_break
|| v_tab || v_tab || 'THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || 'COMMIT;' || v_line_break
|| v_tab || v_tab || v_tab || 'v_last_commit_rule_oid := v_current_rule_oid;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'END IF;' || v_line_break
|| v_line_break;
END IF;
v_sql_stmt := 'CREATE OR REPLACE PACKAGE "' || v_rule_pckg_dataowner || '"."' || v_rule_pckg || '" AS' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_rule_log_start_proc_name || '"' || v_line_break
|| v_tab || '(' || v_line_break
|| v_tab || v_tab || 'in_first_rule_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_commit_threshold IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'out_execution_oid OUT NUMBER' || v_line_break
|| v_tab || ');' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_rule_log_end_proc_name || '"' || v_line_break
|| v_tab || '(' || v_line_break
|| v_tab || v_tab || 'in_execution_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_last_rule_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_last_commit_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_error_msg IN CLOB DEFAULT NULL' || v_line_break
|| v_tab || ');' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_app_proc_name || '";' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_app_proc_name || '"' || v_line_break
|| v_tab || '(' || v_line_break
|| v_tab || v_tab || 'in_first_rule_oid IN NUMBER' || v_line_break
|| v_tab || ');' || v_line_break
|| v_line_break
|| 'END "' || v_rule_pckg || '";';
dbms_output.put_line(v_sql_stmt);
dbms_output.put_line(NULL);
--EXECUTE IMMEDIATE v_sql_stmt;
v_sql_stmt := 'CREATE OR REPLACE PACKAGE BODY "' || v_rule_pckg_dataowner || '"."' || v_rule_pckg || '" AS' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_rule_log_start_proc_name || '"' || v_line_break
|| v_tab || '(' || v_line_break
|| v_tab || v_tab || 'in_first_rule_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_commit_threshold IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'out_execution_oid OUT NUMBER' || v_line_break
|| v_tab || ') IS' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'PRAGMA AUTONOMOUS_TRANSACTION;' || v_line_break
|| v_line_break
|| v_tab || 'BEGIN' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'INSERT INTO "' || v_rule_log_dataowner || '"."' || v_rule_log_tbl || '"' || v_line_break
|| v_tab || v_tab || v_tab || '("FIRST_RULE_OID", "COMMIT_THRESHOLD")' || v_line_break
|| v_tab || v_tab || v_tab || 'VALUES (in_first_rule_oid, in_commit_threshold) RETURNING "OID" INTO out_execution_oid;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'COMMIT;' || v_line_break
|| v_line_break
|| v_tab || 'END "' || v_rule_log_start_proc_name || '";' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_rule_log_end_proc_name || '"' || v_line_break
|| v_tab || '(' || v_line_break
|| v_tab || v_tab || 'in_execution_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_last_rule_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_last_commit_oid IN NUMBER,' || v_line_break
|| v_tab || v_tab || 'in_error_msg IN CLOB DEFAULT NULL' || v_line_break
|| v_tab || ') IS' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'PRAGMA AUTONOMOUS_TRANSACTION;' || v_line_break
|| v_line_break
|| v_tab || 'BEGIN' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'UPDATE "' || v_rule_log_dataowner || '"."' || v_rule_log_tbl || '"' || v_line_break
|| v_tab || v_tab || v_tab || 'SET "END_DT" = SYSDATE, "LAST_RULE_OID" = in_last_rule_oid, "LAST_COMMIT_OID" = in_last_commit_oid, "ERROR_MSG" = in_error_msg' || v_line_break
|| v_tab || v_tab || v_tab || 'WHERE "OID" = in_execution_oid;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'COMMIT;' || v_line_break
|| v_line_break
|| v_tab || 'END "' || v_rule_log_end_proc_name || '";' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_app_proc_name || '" IS' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'v_execution_log_oid INTEGER;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'v_current_rule_oid INTEGER := 0;' || v_line_break
|| v_tab || v_tab || 'v_last_commit_rule_oid INTEGER := 0;' || v_line_break
|| v_line_break
|| (CASE v_app_proc_commit_threshold < 2 WHEN TRUE THEN NULL ELSE v_tab || v_tab || '--v_commit_threshold was hardcoded to ' || v_app_proc_commit_threshold || v_line_break END)
|| (CASE v_app_proc_commit_threshold < 2 WHEN TRUE THEN NULL ELSE v_tab || v_tab || 'v_loop_counter INTEGER := 0;' || v_line_break END)
|| v_line_break
|| v_tab || v_tab || 'v_sql_stmt CLOB;' || v_line_break
|| v_line_break
|| v_tab || 'BEGIN' || v_line_break
|| v_line_break
|| v_tab || v_tab || '"' || v_rule_log_start_proc_name || '"(NULL, ' || v_app_proc_commit_threshold || ', v_execution_log_oid);' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'FOR DH_RULE IN ' || v_line_break
|| v_tab || v_tab || '(' || v_line_break
|| v_tab || v_tab || v_tab || 'SELECT R."OID", R."WHERE_CLAUSE", R."SET_CLAUSE", R."ON_SUCCESS_CLAUSE" FROM "' || v_rule_dataowner || '"."' || v_rule_tbl || '" R' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'WHERE R."SET_CLAUSE" IS NOT NULL AND SYSDATE BETWEEN R."ACTIVE_FROM" AND R."ACTIVE_TO"' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'ORDER BY R."PRIORITY_LBH" ASC, R."OID" ASC' || v_line_break
|| v_tab || v_tab || ')' || v_line_break
|| v_tab || v_tab || 'LOOP' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || 'v_current_rule_oid := DH_RULE."OID";' || v_line_break
|| v_tab || v_tab || v_tab || 'v_sql_stmt := ''UPDATE "' || v_main_dataowner || '"."' || v_main_tbl || '" SET "CURRENT_MOD_SRC_TYPE" = ''''rule'''', "CURRENT_MOD_SRC" = '' || v_current_rule_oid || '', '' || DH_RULE."SET_CLAUSE" || '' WHERE "STATUS" = 1 AND '' || DH_RULE."WHERE_CLAUSE";' || v_line_break
|| v_tab || v_tab || v_tab || 'EXECUTE IMMEDIATE v_sql_stmt;' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || 'IF SQL%ROWCOUNT > 0' || v_line_break
|| v_tab || v_tab || v_tab || 'THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'IF DH_RULE."ON_SUCCESS_CLAUSE" IS NOT NULL' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || v_tab || 'EXECUTE IMMEDIATE DH_RULE."ON_SUCCESS_CLAUSE";' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'END IF;' || v_line_break
|| v_line_break
|| v_sql_stmt_main_commit_clause
|| v_tab || v_tab || v_tab || 'END IF;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'END LOOP;' || v_line_break
|| v_line_break
|| v_sql_stmt_final_commit_clause
|| v_tab || v_tab || '"' || v_rule_log_end_proc_name || '"(v_execution_log_oid, v_current_rule_oid, v_last_commit_rule_oid);' || v_line_break
|| v_line_break
|| v_tab || 'EXCEPTION' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'WHEN OTHERS THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || '"' || v_rule_log_end_proc_name || '"(v_execution_log_oid, v_current_rule_oid, v_last_commit_rule_oid, SQLERRM);' || v_line_break
|| v_tab || v_tab || v_tab || 'ROLLBACK;' || v_line_break
|| v_line_break
|| v_tab || 'END "' || v_app_proc_name || '";' || v_line_break
|| v_line_break
|| v_tab || 'PROCEDURE "' || v_app_proc_name || '"' || v_line_break
|| v_tab || '(' || v_line_break
|| v_tab || v_tab || 'in_first_rule_oid IN NUMBER' || v_line_break
|| v_tab || ') IS' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'v_execution_log_oid INTEGER;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'v_first_rule_priority ' || v_rule_priority_datatype || ';' || v_line_break
|| v_tab || v_tab || 'v_current_rule_oid INTEGER := 0;' || v_line_break
|| v_tab || v_tab || 'v_last_commit_rule_oid INTEGER := 0;' || v_line_break
|| v_line_break
|| (CASE v_app_proc_commit_threshold < 2 WHEN TRUE THEN NULL ELSE v_tab || v_tab || '--v_commit_threshold was hardcoded to ' || v_app_proc_commit_threshold || v_line_break END)
|| (CASE v_app_proc_commit_threshold < 2 WHEN TRUE THEN NULL ELSE v_tab || v_tab || 'v_loop_counter INTEGER := 0;' || v_line_break END)
|| v_line_break
|| v_tab || v_tab || 'v_sql_stmt CLOB;' || v_line_break
|| v_line_break
|| v_tab || 'BEGIN' || v_line_break
|| v_line_break
|| v_tab || v_tab || '"' || v_rule_log_start_proc_name || '"(in_first_rule_oid, ' || v_app_proc_commit_threshold || ', v_execution_log_oid);' || v_line_break
|| v_line_break
|| v_tab || v_tab ||'SELECT ' || v_rule_priority_col_name || ' INTO v_first_rule_priority FROM "' || v_rule_dataowner || '"."' || v_rule_tbl || '"' || v_line_break
|| v_tab || v_tab || v_tab || 'WHERE "OID" = in_first_rule_oid;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'FOR DH_RULE IN ' || v_line_break
|| v_tab || v_tab || '(' || v_line_break
|| v_tab || v_tab || v_tab || 'SELECT R."OID", R."WHERE_CLAUSE", R."SET_CLAUSE", R."ON_SUCCESS_CLAUSE" FROM "' || v_rule_dataowner || '"."' || v_rule_tbl || '" R' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'WHERE R."SET_CLAUSE" IS NOT NULL AND (SYSDATE BETWEEN R."ACTIVE_FROM" AND R."ACTIVE_TO") AND ("' || v_rule_priority_col_name || '" > v_first_rule_priority OR ("' || v_rule_priority_col_name || '" = v_first_rule_priority AND "OID" >= in_first_rule_oid)) ' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'ORDER BY R."PRIORITY_LBH" ASC, R."OID" ASC' || v_line_break
|| v_tab || v_tab || ')' || v_line_break
|| v_tab || v_tab || 'LOOP' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || 'v_current_rule_oid := DH_RULE."OID";' || v_line_break
|| v_tab || v_tab || v_tab || 'v_sql_stmt := ''UPDATE "' || v_main_dataowner || '"."' || v_main_tbl || '" SET "CURRENT_MOD_SRC_TYPE" = ''''rule'''', "CURRENT_MOD_SRC" = '' || v_current_rule_oid || '', '' || DH_RULE."SET_CLAUSE" || '' WHERE "STATUS" = 1 AND '' || DH_RULE."WHERE_CLAUSE";' || v_line_break
|| v_tab || v_tab || v_tab || 'EXECUTE IMMEDIATE v_sql_stmt;' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || 'IF SQL%ROWCOUNT > 0' || v_line_break
|| v_tab || v_tab || v_tab || 'THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'IF DH_RULE."ON_SUCCESS_CLAUSE" IS NOT NULL' || v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || v_tab || 'EXECUTE IMMEDIATE DH_RULE."ON_SUCCESS_CLAUSE";' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || v_tab || 'END IF;' || v_line_break
|| v_line_break
|| v_sql_stmt_main_commit_clause
|| v_tab || v_tab || v_tab || 'END IF;' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'END LOOP;' || v_line_break
|| v_line_break
|| v_sql_stmt_final_commit_clause
|| v_tab || v_tab || '"' || v_rule_log_end_proc_name || '"(v_execution_log_oid, v_current_rule_oid, v_last_commit_rule_oid);' || v_line_break
|| v_line_break
|| v_tab || 'EXCEPTION' || v_line_break
|| v_line_break
|| v_tab || v_tab || 'WHEN OTHERS THEN' || v_line_break
|| v_line_break
|| v_tab || v_tab || v_tab || '"' || v_rule_log_end_proc_name || '"(v_execution_log_oid, v_current_rule_oid, v_last_commit_rule_oid, SQLERRM);' || v_line_break
|| v_tab || v_tab || v_tab || 'ROLLBACK;' || v_line_break
|| v_line_break
|| v_tab || 'END "' || v_app_proc_name || '";' || v_line_break
|| v_line_break
|| 'END "' || v_rule_pckg || '";';
dbms_output.put_line(v_sql_stmt);
dbms_output.put_line(NULL);
--EXECUTE IMMEDIATE v_sql_stmt;
END;