[Home] [Help]
PACKAGE BODY: APPS.XLE_HISTORY_PUB
Source
1 PACKAGE BODY XLE_History_PUB AS
2 /* $Header: xlehispb.pls 120.8.12020000.2 2012/11/30 05:52:39 srampure ship $ */
3
4 PROCEDURE get_record_snapshot(
5 p_id NUMBER,
6 p_primary_key_name VARCHAR2,
7 p_table_name VARCHAR2,
8 p_mode VARCHAR2) IS
9
10 -- statement that retrieves the name and type of all the columns from p_table_name
11 l_select_col_stmt VARCHAR2(4000);
12 -- statement that retrieves a row with PK value p_id from p_table_name
13 l_select_val_stmt VARCHAR2(4000);
14 l_cursor INTEGER;
15 l_column_name ALL_TAB_COLUMNS.column_name%TYPE;
16 l_data_type ALL_TAB_COLUMNS.data_type%TYPE;
17 l_dummy INTEGER;
18 l_index NUMBER:=1;
19
20 BEGIN
21 l_cursor := DBMS_SQL.OPEN_CURSOR;
22 l_select_col_stmt := 'select col.column_name, col.data_type from user_synonyms syn, ALL_TAB_COLUMNS col'
23 || ' where syn.synonym_name = :tab_name and col.owner = syn.table_owner and col.table_name = syn.table_name order by COL.column_id';
24 l_select_val_stmt := 'select';
25
26 DBMS_SQL.PARSE(l_cursor, l_select_col_stmt, DBMS_SQL.V7);
27 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tab_name', p_table_name);
28 DBMS_SQL.DEFINE_COLUMN(l_cursor, 1, l_column_name, 30);
29 DBMS_SQL.DEFINE_COLUMN(l_cursor, 2, l_data_type, 106);
30
31 l_dummy := DBMS_SQL.EXECUTE(l_cursor);
32
33 l_index := 1;
34
35 LOOP
36 IF DBMS_SQL.FETCH_ROWS(l_cursor) = 0 THEN
37 EXIT;
38 END IF;
39
40 DBMS_SQL.COLUMN_VALUE(l_cursor, 1, l_column_name);
41 DBMS_SQL.COLUMN_VALUE(l_cursor, 2, l_data_type);
42
43 -- some standard columns are not tracked
44 IF (l_column_name NOT IN ('CREATED_BY',
45 'CREATION_DATE',
46 'LAST_UPDATED_BY',
47 'LAST_UPDATE_DATE',
48 'LAST_UPDATE_LOGIN',
49 'OBJECT_VERSION_NUMBER')) THEN
50 IF (p_mode = 'PRE') THEN
51 G_VALUE_LIST(l_index).column_name := l_column_name;
52 G_VALUE_LIST(l_index).data_type := l_data_type;
53 ELSE
54 -- in POST mode, only the snapshot of the SAME record is taken
55 IF (G_VALUE_LIST(l_index).column_name <> l_column_name)
56 THEN
57 RAISE FND_API.G_EXC_ERROR;
58 END IF;
59 END IF;
60
61 -- handle special first case
62 IF (length(l_select_val_stmt) = 6) THEN
63 l_select_val_stmt := l_select_val_stmt || ' ';
64 ELSE
65 l_select_val_stmt := l_select_val_stmt || ', ';
66 END IF;
67
68 IF (l_data_type = 'VARCHAR2') THEN
69 l_select_val_stmt := l_select_val_stmt || l_column_name;
70 ELSIF (l_data_type = 'NUMBER') THEN
71 l_select_val_stmt := l_select_val_stmt || 'to_char(' || l_column_name || ')';
72 ELSIF (l_data_Type = 'DATE') THEN
73 l_select_val_stmt := l_select_val_stmt || 'to_char(' || l_column_Name || ', ''DD-MON-YYYY HH24:MI:SS'')';
74 ELSE
75 l_select_val_stmt := l_select_val_stmt || l_column_name;
76 END IF;
77 l_index := l_index + 1;
78 END IF;
79 END LOOP;
80 l_index := G_VALUE_LIST.count;
81
82 DBMS_SQL.CLOSE_CURSOR(l_cursor);
83
84 IF (length(l_select_val_stmt) > 6) THEN
85 l_select_val_stmt := l_select_val_stmt || ' from ' || p_table_name || '
86 where ';
87 l_select_val_stmt := l_select_val_stmt || p_primary_key_name || ' = :p_id';
88
89 l_cursor := DBMS_SQL.OPEN_CURSOR;
90
91 DBMS_SQL.PARSE(l_cursor, l_select_val_stmt, DBMS_SQL.V7);
92 DBMS_SQL.BIND_VARIABLE(l_cursor, ':p_id', p_id);
93
94 --log_csc_form_debug_message('Shikha','select'||l_select_val_stmt);
95 --log_csc_form_debug_message('Shikha','cursor'||l_cursor);
96 FOR i IN 1..l_index LOOP
97 IF (p_mode = 'PRE') THEN
98 DBMS_SQL.DEFINE_COLUMN(l_cursor, i, G_VALUE_LIST(i).old_value, 2000);
99 ELSE
100 DBMS_SQL.DEFINE_COLUMN(l_cursor, i, G_VALUE_LIST(i).new_value, 2000);
101 END IF;
102 END LOOP;
103
104 l_dummy := DBMS_SQL.EXECUTE(l_cursor);
105
106 IF DBMS_SQL.FETCH_ROWS(l_cursor) = 0 THEN
107 --log_csc_form_debug_message('Shikha','inside fetch'||l_cursor);
108 RAISE NO_DATA_FOUND;
109 END IF;
110
111 FOR i IN 1..l_index LOOP
112 IF (p_mode = 'PRE') THEN
113 DBMS_SQL.COLUMN_VALUE(l_cursor, i, G_VALUE_LIST(i).old_value);
114 ELSE
115 DBMS_SQL.COLUMN_VALUE(l_cursor, i, G_VALUE_LIST(i).new_value);
116 END IF;
117 END LOOP;
118
119 DBMS_SQL.CLOSE_CURSOR(l_cursor);
120 ELSE
121 RAISE FND_API.G_EXC_ERROR;
122 END IF;
123 EXCEPTION
124 WHEN OTHERS THEN
125 DBMS_SQL.CLOSE_CURSOR(l_cursor);
126 RAISE;
127 END get_record_snapshot;
128
129 PROCEDURE log_changes(
130 p_effective_from DATE,
131 p_comment VARCHAR2,
132 p_return_status OUT NOCOPY VARCHAR2,
133 p_error_type OUT NOCOPY VARCHAR2) IS
134
135 l_hist_id NUMBER := NULL;
136 l_history_id NUMBER := NULL;
137 l_flag Varchar2(5):='N';
138 l_eff_flag Varchar2(5):='N';
139 l_eff varchar2(2000);
140 l_eff_from Date;
141 l_count Number:=0;
142 l_column_name Varchar2(200);
143
144 v_chk varchar2(1):='0';
145 v_chk2 varchar2(1):='0';
146
147 l_start_date Date;
148
149 cursor eff_from is
150 select effective_from
151 from xle_histories
152 where source_id=G_PRIMARY_KEY_ID
153 and source_table=G_TABLE_NAME
154 and source_column_name=l_column_name
155 and effective_to is null;
156 BEGIN
157
158 FOR i IN 1..G_VALUE_LIST.count LOOP
159 IF (G_VALUE_LIST(i).old_value <> G_VALUE_LIST(i).new_value
160 OR (G_VALUE_LIST(i).old_value IS NULL AND G_VALUE_LIST(i).new_value
161 IS NOT NULL)
162 OR (G_VALUE_LIST(i).old_value IS NOT NULL AND G_VALUE_LIST(i).new_value IS NULL))
163 THEN
164
165 l_count:=l_count+1;
166 l_column_name:=G_VALUE_LIST(i).column_name;
167
168 For eff_from_r in eff_from loop
169 If p_effective_from<eff_from_r.effective_from then
170 l_eff_flag:='Y';
171 End If;
172 End loop;
173
174 If G_VALUE_LIST(i).column_name='EFFECTIVE_TO' then
175 l_flag:='Y';
176 --l_eff:=FND_DATE.CANONICAL_TO_DATE(G_VALUE_LIST(i).new_value);
177 l_eff:=G_VALUE_LIST(i).new_value;
178 End if;
179
180 v_chk:='0';
181 v_chk2:='0';
182
183 begin
184 select effective_from into l_start_date
185 from xle_registrations
186 where registration_id = G_PRIMARY_KEY_ID
187 and rownum < 2;
188 exception
189 when NO_DATA_FOUND then
190 l_start_date:=SYSDATE;
191 end;
192
193
194 begin
195 select '1' into v_chk
196 from xle_histories
197 where source_id =G_PRIMARY_KEY_ID
198 and source_table=G_TABLE_NAME
199 and source_column_name=G_VALUE_LIST(i).column_name
200 and rownum <2;
201 exception
202 when NO_DATA_FOUND THEN
203
204 XLE_Histories_PKG.Insert_Row(
205 x_history_id => l_hist_id,
206 p_source_table => G_TABLE_NAME,
207 p_source_id => G_PRIMARY_KEY_ID,
208 p_source_column_name => G_VALUE_LIST(i).column_name,
209 p_source_column_value => G_VALUE_LIST(i).old_value,
210 p_effective_from => l_start_date,
211 p_effective_to => p_effective_from,
212 p_comment => 'Creation',
213 p_object_version_number => 1);
214
215 end;
216
217
218 delete from xle_histories
219 where source_id=G_PRIMARY_KEY_ID
220 and source_table=G_TABLE_NAME
221 and source_column_name=G_VALUE_LIST(i).column_name
222 and effective_from > nvl(p_effective_from,sysdate);
223
224 if sql%rowcount > 0 then
225 /* XLE_Histories_PKG.Insert_Row(
226 x_history_id => l_history_id,
227 p_source_table => G_TABLE_NAME,
228 p_source_id => G_PRIMARY_KEY_ID,
229 p_source_column_name => G_VALUE_LIST(i).column_name,
230 p_source_column_value => G_VALUE_LIST(i).new_value,
231 p_effective_from => l_start_date,
232 p_comment => 'Creation',
233 p_object_version_number => 1);*/
234
235 v_chk2:='1';
236
237 end if;
238
239 if (v_chk2='0') then
240
241 update XLE_Histories
242 set effective_to=decode(trunc(effective_from),trunc(nvl(p_effective_from,sysdate)),(nvl2(p_effective_from,p_effective_from-(1/86400),sysdate-(1/86400))),nvl(p_effective_from,sysdate)-1)
243 where source_id=G_PRIMARY_KEY_ID
244 and source_table=G_TABLE_NAME
245 and source_column_name=G_VALUE_LIST(i).column_name
246 and effective_to is null;
247
248 end if;
249
250 XLE_Histories_PKG.Insert_Row(
251 x_history_id => l_history_id,
252 p_source_table => G_TABLE_NAME,
253 p_source_id => G_PRIMARY_KEY_ID,
254 p_source_column_name => G_VALUE_LIST(i).column_name,
255 p_source_column_value => G_VALUE_LIST(i).new_value,
256 p_effective_from => p_effective_from,
257 p_comment => p_comment,
258 p_object_version_number => 1);
259
260
261
262 -- TODO: update the effective_from of the previous record to p_effective_from - 1
263 END IF;
264 END LOOP;
265
266 If l_flag='Y' then
267 update xle_histories
268 SET effective_to =to_date(to_char(to_date(l_eff, 'DD-MON-YYYY HH24:MI:SS'), 'DD-MM-YYYY'), 'DD-MM-YYYY')
269 where source_id=G_PRIMARY_KEY_ID
270 and source_table=G_TABLE_NAME
271 and effective_to is null;
272
273 IF (sql%notfound) THEN
274 RAISE no_data_found;
275 END IF;
276 End if;
277
278 If l_count>1 and l_eff_flag='Y' then
279 p_return_status:='E';
280 p_error_type := 'DataError';
281 ElsIf l_count=1 and l_eff_flag='Y' and v_chk2='0' then
282 Delete from xle_histories
283 where source_id=G_PRIMARY_KEY_ID
284 and source_table=G_TABLE_NAME
285 and source_column_name=l_column_name
286 and effective_from > p_effective_from ;
287 End If;
288
289 EXCEPTION
290 WHEN OTHERS THEN
291 RAISE;
292
293 END log_changes;
294
295 PROCEDURE log_record_pre(
296 p_id NUMBER,
297 p_primary_key_name VARCHAR2,
298 p_table_name VARCHAR2) IS
299 BEGIN
300 -- reset the table
301 G_VALUE_LIST.delete;
302 G_PRIMARY_KEY_NAME := p_primary_key_name;
303 G_PRIMARY_KEY_ID := p_id;
304 G_TABLE_NAME := p_table_name;
305 get_record_snapshot(p_id, p_primary_key_name, p_table_name, 'PRE');
306 END log_record_pre;
307
308 procedure log_record_post(
309 p_id NUMBER,
310 p_primary_key_name VARCHAR2,
311 p_table_name VARCHAR2,
312 p_effective_from DATE,
313 p_comment VARCHAR2,
314 p_error_type OUT NOCOPY VARCHAR2,
315 p_return_status OUT NOCOPY VARCHAR2) IS
316
317 l_return_status VARCHAR2(5);
318 l_error_type VARCHAR2(50);
319
320 BEGIN
321 -- no pre update snapshot
322 IF (G_VALUE_LIST.count = 0) THEN
323 RAISE FND_API.G_EXC_ERROR;
324 END IF;
325
326 -- invalid table name
327 IF (G_TABLE_NAME <> p_table_name) THEN
328 RAISE FND_API.G_EXC_ERROR;
329 END IF;
330
331 IF (G_PRIMARY_KEY_NAME <> p_primary_key_name OR G_PRIMARY_KEY_ID <> p_id) THEN
332 RAISE FND_API.G_EXC_ERROR;
333 END IF;
334
335 get_record_snapshot(p_id, p_primary_key_name, p_table_name, 'POST');
336 log_changes(p_effective_from, p_comment,l_return_status,l_error_type);
337
338 If l_return_status='E' then
339 p_error_type := l_error_type;
340 p_return_status:=l_return_status;
341 End if;
342
343 EXCEPTION
344 WHEN OTHERS THEN
345 RAISE;
346 END log_record_post;
347
348 procedure log_record_ins(
349 p_id NUMBER,
350 p_primary_key_name VARCHAR2,
351 p_table_name VARCHAR2,
352 p_effective_from DATE,
353 p_comment VARCHAR2,
354 p_error_type OUT NOCOPY VARCHAR2,
355 p_return_status OUT NOCOPY VARCHAR2
356 ) IS
357
358 l_return_status VARCHAR2(5);
359 l_error_type VARCHAR2(50);
360
361 l_index NUMBER:=1;
362
363 cursor history is
364 select source_column_name
365 from xle_history_columns_b;
366
367 l_source_column_name varchar2(2000);
368 l_id number;
369
370 l_history_id NUMBER := NULL;
371 l_flag Varchar2(5):='N';
372 l_eff_flag Varchar2(5):='N';
373 l_eff varchar2(2000);
374 l_eff_from Date;
375 l_count Number:=0;
376 l_column_name Varchar2(200);
377
378
379 BEGIN
380 G_VALUE_LIST.delete;
381 G_PRIMARY_KEY_NAME := p_primary_key_name;
382 G_PRIMARY_KEY_ID := p_id;
383 G_TABLE_NAME := p_table_name;
384
385 for history_r in history loop
386
387 G_VALUE_LIST(l_index).column_name := history_r.source_column_name;
388 l_index := l_index + 1;
389 end loop;
390 begin
391
392 execute immediate
393 'select ' ||
394 G_VALUE_LIST(1).column_name ||','
395 || G_VALUE_LIST(2).column_name ||','
396 || G_VALUE_LIST(3).column_name ||','
397 || G_VALUE_LIST(4).column_name ||','
398 || G_VALUE_LIST(5).column_name ||','
399 || G_VALUE_LIST(6).column_name ||','
400 || G_VALUE_LIST(7).column_name ||','
401 || G_VALUE_LIST(8).column_name ||','
402 || G_VALUE_LIST(9).column_name ||','
403 || G_VALUE_LIST(10).column_name ||','
404 || G_VALUE_LIST(11).column_name ||','
405 || G_VALUE_LIST(12).column_name ||','
406 || G_VALUE_LIST(13).column_name ||','
407 || G_VALUE_LIST(14).column_name ||','
408 || G_VALUE_LIST(15).column_name ||','
409 || G_VALUE_LIST(16).column_name ||','
410 || G_VALUE_LIST(17).column_name ||','
411 || G_VALUE_LIST(18).column_name ||','
412 || G_VALUE_LIST(19).column_name ||','
413 || G_VALUE_LIST(20).column_name ||','
414 || G_VALUE_LIST(21).column_name ||','
415 || G_VALUE_LIST(22).column_name ||','
416 || G_VALUE_LIST(23).column_name ||','
417 || G_VALUE_LIST(24).column_name ||','
418 || G_VALUE_LIST(25).column_name ||','
419 || G_VALUE_LIST(26).column_name ||','
420 || G_VALUE_LIST(27).column_name ||','
421 || G_VALUE_LIST(28).column_name ||','
422 || G_VALUE_LIST(29).column_name ||'
423 from XLE_REGISTRATIONS where REGISTRATION_ID='||p_id
424
425 INTO G_VALUE_LIST(1).new_value
426 , G_VALUE_LIST(2).new_value
427 , G_VALUE_LIST(3).new_value
428 , G_VALUE_LIST(4).new_value
429 , G_VALUE_LIST(5).new_value
430 , G_VALUE_LIST(6).new_value
431 , G_VALUE_LIST(7).new_value
432 , G_VALUE_LIST(8).new_value
433 , G_VALUE_LIST(9).new_value
434 , G_VALUE_LIST(10).new_value
435 , G_VALUE_LIST(11).new_value
436 , G_VALUE_LIST(12).new_value
437 , G_VALUE_LIST(13).new_value
438 , G_VALUE_LIST(14).new_value
439 , G_VALUE_LIST(15).new_value
440 , G_VALUE_LIST(16).new_value
441 , G_VALUE_LIST(17).new_value
442 , G_VALUE_LIST(18).new_value
443 , G_VALUE_LIST(19).new_value
444 , G_VALUE_LIST(20).new_value
445 , G_VALUE_LIST(21).new_value
446 , G_VALUE_LIST(22).new_value
447 , G_VALUE_LIST(23).new_value
448 , G_VALUE_LIST(24).new_value
449 , G_VALUE_LIST(25).new_value
450 , G_VALUE_LIST(26).new_value
451 , G_VALUE_LIST(27).new_value
452 , G_VALUE_LIST(28).new_value
453 , G_VALUE_LIST(29).new_value;
454
455 Exception
456
457 WHEN OTHERS THEN
458 RAISE;
459 end;
460
461 FOR i IN 1..G_VALUE_LIST.count LOOP
462 IF G_VALUE_LIST(i).new_value IS NOT NULL THEN
463 l_count:=l_count+1;
464 l_column_name:=G_VALUE_LIST(i).column_name;
465
466 XLE_Histories_PKG.Insert_Row(
467 x_history_id => l_history_id,
468 p_source_table => G_TABLE_NAME,
469 p_source_id => G_PRIMARY_KEY_ID,
470 p_source_column_name => G_VALUE_LIST(i).column_name,
471 p_source_column_value => G_VALUE_LIST(i).new_value,
472 p_effective_from => p_effective_from,
473 p_comment => p_comment,
474 p_object_version_number => 1);
475 END IF;
476 END LOOP;
477
478 Exception
479
480 WHEN OTHERS THEN
481 RAISE;
482 END log_record_ins;
483
484 END XLE_History_PUB;
485