[Home] [Help]
PACKAGE BODY: APPS.MSD_PURGE
Source
1 PACKAGE BODY MSD_PURGE AS
2 /* $Header: msdpurgb.pls 120.1 2010/04/30 09:04:13 lannapra ship $ */
3
4
5 /* The following are helper cursors and procedures for deleting
6 * information in the headers table for custom streams. There are
7 * two important cases:
8 *
9 * 1. When the date is specified: In this case it is not known
10 * which information is deleted from the msd_cs_data table.
11 * Therfore, each header needs to be checked if a row
12 * exists in the msd_cs_data table that refers to it.
13 *
14 * 2. When no date is specified the data from msd_cs_data_headers
15 * can immediately be deleted.
16 */
17
18 /* If given the name of a stream this provides the definition id.
19 * This is useful when on the UI, there is no option to select
20 * the custom stream, but represented in a hard-coded label.
21 */
22
23 CURSOR get_cs_definition_id(p_cs_name in VARCHAR2) IS
24 SELECT cs_definition_id
25 FROM msd_cs_definitions
26 WHERE name = p_cs_name;
27
28 CURSOR get_cs_system_flag(p_cs_iden in VARCHAR2) IS
29 SELECT system_flag
30 FROM msd_cs_definitions
31 WHERE cs_definition_id = p_cs_iden;
32
33
34 /* Helper Functions */
35
36
37 /* Helper procedure for deleting data from custom stream tables.
38 */
39
40 procedure delete_cs_data ( p_instance_id IN varchar2,
41 p_cs_definition_id IN number,
42 p_cs_designator IN varchar2,
43 p_from_date IN date,
44 p_to_date IN date ) IS
45
46 TYPE cs_data_id_tab is table of msd_cs_data.cs_data_id%TYPE;
47
48 t_cs_data_id cs_data_id_tab;
49
50
51 cursor get_cs_data is
52 select cs_data_id
53 from msd_cs_data
54 where cs_definition_id in (select cs_definition_id
55 from msd_cs_definitions
56 where cs_definition_id = nvl(p_cs_definition_id , cs_definition_id)
57 and ((p_cs_definition_id is not null) or
58 (system_flag = 'C')))
59 and nvl(cs_name, '#$#$^&&&!!!!!!$%$%$%$%090@@') = nvl(p_cs_designator, nvl(cs_name, '#$#$^&&&!!!!!!$%$%$%$%090@@'))
60 and nvl(attribute_43, '0001/01/01') between nvl(to_char(p_from_date, 'YYYY/MM/DD'), '0001/01/01')
61 and nvl(to_char(p_to_date, 'YYYY/MM/DD'), '4317/12/31')
62 and nvl(attribute_1, '-999') = nvl(p_instance_id, nvl(attribute_1, '-999'));
63
64 C_NUM_DELETE_ROWS number := 1000;
65
66 begin
67
68 open get_cs_data;
69
70 loop
71
72 fetch get_cs_data bulk collect into t_cs_data_id LIMIT C_NUM_DELETE_ROWS;
73
74 if (t_cs_data_id.exists(1)) then
75
76 FORALL i IN t_cs_data_id.FIRST..t_cs_data_id.LAST
77 DELETE FROM msd_cs_data
78 WHERE cs_data_id = t_cs_data_id(i);
79
80 FORALL i IN t_cs_data_id.FIRST..t_cs_data_id.LAST
81 DELETE FROM msd_cs_data_ds
82 WHERE cs_data_id = t_cs_data_id(i);
83 else
84 exit;
85 end if;
86
87 end loop;
88
89 close get_cs_data;
90
91 /* Analyze Custom Stream Tables */
92 MSD_ANALYZE_TABLES.analyze_table(null, 5);
93 /* End Analyze */
94
95 end delete_cs_data;
96
97 /* Table handler for the cs_data_header table. */
98 procedure delete_cs_headers (p_instance_id IN NUMBER,
99 p_cs_def_id IN NUMBER,
100 p_cs_name IN VARCHAR2) IS
101
102 begin
103
104 delete from msd_cs_data_headers
105 where instance = nvl(p_instance_id, instance)
106 and cs_definition_id = nvl(p_cs_def_id, cs_definition_id)
107 and cs_name = nvl(p_cs_name, cs_name);
108
109
110
111 end delete_cs_headers;
112
113
114 /* Check for each header whether it contains a child row in msd_cs_data.
115 * This procedure is called when date parameters are entered in purge.
116 */
117 procedure check_cs_headers (p_instance_id IN NUMBER,
118 p_cs_def_id IN NUMBER,
119 p_cs_name IN VARCHAR2) IS
120
121 x_num_rows number := 1;
122
123 cursor check_cs_data(p_instance_id in NUMBER, p_cs_id in number, p_cs_name in VARCHAR2) is
124 select 1
125 from msd_cs_data
126 where attribute_1 = p_instance_id
127 and cs_definition_id = p_cs_id
128 and cs_name = p_cs_name
129 and rownum = x_num_rows;
130
131 cursor check_cs_data_headers is
132 select *
133 from msd_cs_data_headers
134 where instance = nvl(p_instance_id, instance)
135 and cs_definition_id = nvl(p_cs_def_id, cs_definition_id)
136 and cs_name = nvl(p_cs_name, cs_name)
137 and exists ( select 1
138 from msd_cs_definitions csd
139 where csd.cs_definition_id = msd_cs_data_headers.cs_definition_id
140 and csd.system_flag = 'C' );
141
142 x_count number := 0;
143
144 begin
145
146 /* Loop through all headers */
147
148 for cs_rec in check_cs_data_headers loop
149
150 open check_cs_data(cs_rec.instance, cs_rec.cs_definition_id, cs_rec.cs_name);
151 fetch check_cs_data into x_count;
152 if (check_cs_data%NOTFOUND) then
153 delete_cs_headers(cs_rec.instance, cs_rec.cs_definition_id, cs_rec.cs_name);
154 end if;
155 close check_cs_data;
156
157 x_count := 0;
158
159 end loop;
160
161 end check_cs_headers;
162
163
164 /* This procedure is called after data is deleted from msd_cs_data.
165 * It will determine whether dates are defined and determine
166 * whether headers need to check for children in msd_cs_data
167 */
168
169 procedure purge_cs_data_headers(p_instance_id IN NUMBER,
170 p_from_date IN VARCHAR2,
171 p_to_date IN VARCHAR2,
172 p_cs_def_id IN NUMBER,
173 p_cs_name IN VARCHAR2) IS
174
175 begin
176
177 /* Date is included so the msd_cs_data needs to be checked for rows
178 * that are deleted.
179 */
180
181 if (p_from_date is not null) or (p_to_date is not null) then
182
183 /* Deletes data in headers checking date-filtered deletes in msd_cs_data */
184 check_cs_headers (p_instance_id, p_cs_def_id, p_cs_name);
185
186 else
187
188 /* Deletes directly from headers since no date filtering done. */
189
190 delete from msd_cs_data_headers
191 where instance = nvl(p_instance_id, instance)
192 and cs_definition_id = nvl(p_cs_def_id, cs_definition_id)
193 and cs_name = nvl(p_cs_name, cs_name)
194 and exists ( select 1
195 from msd_cs_definitions csd
196 where csd.cs_definition_id = msd_cs_data_headers.cs_definition_id
197 and csd.system_flag = 'C' );
198
199 end if;
200
201 end purge_cs_data_headers;
202
203 /* Check for each header whether it contains a child row in msd_cs_data.
204 * This procedure is called when date parameters are entered in purge.
205 */
206 procedure check_mfg_headers (p_instance_id IN NUMBER,
207 p_cs_def_id IN NUMBER,
208 p_cs_name IN VARCHAR2) IS
209
210 x_num_rows number := 1;
211
212 cursor check_mfg_data(p_instance_id in NUMBER, p_cs_id in number, p_cs_name in VARCHAR2) is
213 select 1
214 from msd_mfg_forecast
215 where instance = p_instance_id
216 and forecast_designator = p_cs_name
217 and rownum = x_num_rows;
218
219 cursor check_cs_data_headers is
220 select *
221 from msd_cs_data_headers
222 where instance = nvl(p_instance_id, instance)
223 and cs_definition_id = nvl(p_cs_def_id, cs_definition_id)
224 and cs_name = nvl(p_cs_name, cs_name);
225
226 x_count number := 0;
227
228 begin
229
230 /* Loop through all headers */
231
232 for cs_rec in check_cs_data_headers loop
233
234 open check_mfg_data(cs_rec.instance, cs_rec.cs_definition_id, cs_rec.cs_name);
235 fetch check_mfg_data into x_count;
236 if (check_mfg_data%NOTFOUND) then
237 delete_cs_headers(cs_rec.instance, cs_rec.cs_definition_id, cs_rec.cs_name);
238 end if;
239 close check_mfg_data;
240
241 x_count := 0;
242
243 end loop;
244
245 end check_mfg_headers;
246
247
248 /* This procedure is called after data is deleted from msd_mfg_forecast.
249 * It will determine whether dates are defined and determine
250 * whether headers need to check for children in msd_mfg_forecast
251 */
252
253 procedure purge_mfg_data_headers(p_instance_id IN NUMBER,
254 p_cs_def_id IN NUMBER,
255 p_l_date IN NUMBER,
256 p_cs_name IN VARCHAR2) IS
257
258 begin
259
260 /* Date is included so the msd_cs_data needs to be checked for rows
261 * that are deleted.
262 */
263
264 if (p_l_date <> 0) then
265
266 /* Deletes data in headers checking date-filtered deletes in msd_cs_data */
267 check_mfg_headers (p_instance_id, p_cs_def_id, p_cs_name);
268
269 else
270
271 /* Deletes directly from headers since no date filtering done. */
272 delete_cs_headers(p_instance_id, p_cs_def_id, p_cs_name);
273
274 end if;
275
276 end purge_mfg_data_headers;
277
278 /* Check for each header whether it contains a child row in msd_cs_data.
279 * This procedure is called when date parameters are entered in purge.
280 */
281 procedure check_int_headers (p_instance_id IN NUMBER,
282 p_cs_def_id IN NUMBER,
283 p_cs_name IN VARCHAR2) IS
284
285 x_num_rows number := 1;
286
287 cursor check_int_data(p_instance_id in NUMBER, p_cs_id in number, p_cs_name in VARCHAR2) is
288 select 1
289 from msd_cs_data
290 where attribute_1 = p_instance_id
291 and cs_definition_id = p_cs_id
292 and cs_name = p_cs_name
293 and rownum = x_num_rows;
294
295 cursor check_cs_data_headers is
296 select *
297 from msd_cs_data_headers
298 where instance = nvl(p_instance_id, instance)
299 and cs_definition_id = p_cs_def_id
300 and cs_name = nvl(p_cs_name, cs_name);
301
302 x_count number := 0;
303
304 begin
305
306 /* Loop through all headers */
307
308 for cs_rec in check_cs_data_headers loop
309
310 open check_int_data(cs_rec.instance, cs_rec.cs_definition_id, cs_rec.cs_name);
311 fetch check_int_data into x_count;
312 if (check_int_data%NOTFOUND) then
313 delete_cs_headers(cs_rec.instance, cs_rec.cs_definition_id, cs_rec.cs_name);
314 end if;
315 close check_int_data;
316
317 x_count := 0;
318
319 end loop;
320
321 end check_int_headers;
322
323
324 /* This procedure is called after data is deleted from msd_cs_data.
325 * It will determine whether dates are defined and determine
326 * whether headers need to check for children in msd_cs_data
327 */
328
329 procedure purge_int_data_headers(p_instance_id IN NUMBER,
330 p_from_date IN VARCHAR2,
331 p_to_date IN VARCHAR2,
332 p_cs_def_id IN NUMBER,
333 p_cs_name IN VARCHAR2) IS
334
335 begin
336
337 /* Date is included so the msd_cs_data needs to be checked for rows
338 * that are deleted.
339 */
340
341 if (p_from_date is not null) or (p_to_date is not null) then
342
343 /* Deletes data in headers checking date-filtered deletes in msd_cs_data */
344 check_int_headers (p_instance_id, p_cs_def_id, p_cs_name);
345
346 else
347
348 /* Deletes directly from headers since no date filtering done. */
349
350 delete from msd_cs_data_headers
351 where instance = nvl(p_instance_id, instance)
352 and cs_definition_id = p_cs_def_id
353 and cs_name = nvl(p_cs_name, cs_name);
354
355 end if;
356
357 end purge_int_data_headers;
358
359
360
361 /* Public Procedures */
362
363 procedure purge_facts(
364 errbuf OUT NOCOPY VARCHAR2,
365 retcode OUT NOCOPY VARCHAR2,
366 p_instance_id IN NUMBER,
367 p_from_date IN VARCHAR2,
368 p_to_date IN VARCHAR2,
369 p_shipment_yes_no IN NUMBER,
370 p_booking_yes_no IN NUMBER,
371 p_mfg_fcst_yes_no IN NUMBER,
372 p_mfg_fcst_desg IN VARCHAR2,
373 p_sales_opp_yes_no IN NUMBER,
374 p_cust_order_yes_no IN NUMBER,
375 p_cust_sales_yes_no IN NUMBER,
376 p_cs_data_yes_no IN NUMBER,
377 p_cs_definition_id IN NUMBER,
378 p_cs_designator IN VARCHAR2,
379 p_curr_yes_no IN NUMBER,
380 p_uom_yes_no IN NUMBER,
381 p_time_yes_no IN NUMBER,
382 p_calendar_code IN VARCHAR2,
383 p_pricing_yes_no IN NUMBER,
384 p_price_list IN VARCHAR2,
385 p_scn_ent_yes_no IN NUMBER,
386 p_demand_plan_id IN NUMBER,
387 p_scenario_id IN NUMBER,
388 p_revision IN VARCHAR2,
389 p_level_values_yes_no IN NUMBER
390 ) IS
391
392 x_from_date DATE;
393 x_to_date DATE;
394 l_delete_from varchar2(500);
395 l_date_where varchar2(500);
396 l_where varchar2(500);
397 l_final_str varchar2(4000);
398 l_date_used number;
399 x_cs_id number;
400 x_sys_flag varchar2(100);
401
402 l_latest_revision number;
403 b_delete_denorm boolean := false;
404
405 begin
406 l_date_used := 0;
407 x_from_date := FND_DATE.canonical_to_date(p_from_date);
408 x_to_date := FND_DATE.canonical_to_date(p_to_date);
409
410 /* Build the date filter where-clause */
411
412 if x_from_date is not null and x_to_date is not null then
413 l_date_where := l_date_where ||
414 ' between to_date(''' ||
415 to_char(x_from_date, 'dd-mon-yyyy') || ''',''DD-MON-RRRR'') AND to_date(''' ||
416 to_char(x_to_date, 'dd-mon-yyyy') || ''',''DD-MON-RRRR'') ' ;
417 l_date_used := 1;
418 elsif x_to_date is not null then
419 l_date_where := l_date_where ||
420 ' <= to_date(''' ||
421 to_char(x_to_date, 'dd-mon-yyyy') || ''',''DD-MON-RRRR'') ' ;
422 l_date_used := 1;
423 elsif x_from_date is not null then
424 l_date_where := l_date_where ||
425 ' >= to_date(''' ||
426 to_char(x_from_date, 'dd-mon-yyyy') || ''',''DD-MON-RRRR'') ' ;
427 l_date_used := 1;
428 end if ;
429
430 -- Delete Shipment data
431 if (p_shipment_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
432 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.SHIPMENT_FACT_TABLE;
433 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
434 if(l_date_used = 1) then
435 l_where := l_where || ' and shipped_date ' || l_date_where;
436 end if;
437 l_final_str := l_delete_from || l_where;
438 EXECUTE IMMEDIATE l_final_str;
439
440 /* Analyze Shipment Fact Tables */
441 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.SHIPMENT_FACT_TABLE,null);
442 /* End Analyze Shipment Fact Tables */
443
444 end if;
445
446 -- Delete Booking data
447 if (p_booking_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
448 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.BOOKING_FACT_TABLE;
449 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
450 if(l_date_used = 1) then
451 l_where := l_where || ' and booked_date ' || l_date_where;
452 end if;
453 l_final_str := l_delete_from || l_where;
454 EXECUTE IMMEDIATE l_final_str;
455
456 /* Analyze Booking Fact Tables */
457 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.BOOKING_FACT_TABLE,null);
458 /* End Analyze Booking Fact Tables */
459
460 end if;
461
462
463
464 -- Delete Manufacturing Forecast data
465 if (p_mfg_fcst_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
466 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.MFG_FCST_FACT_TABLE;
467 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
468 if(l_date_used = 1) then
469 l_where := l_where || ' and forecast_date ' || l_date_where;
470 end if;
471 l_where := l_where || ' and forecast_designator = nvl(:p_mfg_fcst_desg, forecast_designator)' ;
472 l_final_str := l_delete_from || l_where;
473 EXECUTE IMMEDIATE l_final_str using p_mfg_fcst_desg;
474
475 open get_cs_definition_id('MSD_MANUFACTURING_FORECAST');
476 fetch get_cs_definition_id into x_cs_id;
477 close get_cs_definition_id;
478
479 /* Remove header information. If necesary.*/
480 purge_mfg_data_headers(
481 p_instance_id,
482 x_cs_id,
483 l_date_used,
484 p_mfg_fcst_desg);
485
486 /* End Remove headers */
487
488 /* Analyze Manufacturing Forecast Fact Tables */
489 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.MFG_FCST_FACT_TABLE, null);
490 /* End Analyze Manufacturing Forecast Fact Tables */
491
492
493 end if;
494
495 -- Delete Sales Opportunity data
496 if (p_sales_opp_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
497
498 open get_cs_definition_id('MSD_SALES_OPPORTUNITY');
499 fetch get_cs_definition_id into x_cs_id;
500 close get_cs_definition_id;
501
502 delete_cs_data ( p_instance_id,
503 x_cs_id,
504 null,
505 x_from_date,
506 x_to_date );
507
508 purge_int_data_headers(
509 p_instance_id,
510 p_from_date,
511 p_to_date,
512 x_cs_id,
513 null);
514 end if;
515
516
517 /** Added for Bug 2488293 - PURGE CUSTOM STREAM DATA GOT FROM DP-CP INTEGRATION **/
518 -- Delete Customer Orders Forecast data
519 if (p_cust_order_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
520
521 open get_cs_definition_id('MSD_CUSTOMER_ORDER_FORECAST');
522 fetch get_cs_definition_id into x_cs_id;
523 close get_cs_definition_id;
524
525 delete_cs_data ( p_instance_id,
526 x_cs_id,
527 null,
528 x_from_date,
529 x_to_date );
530
531 purge_int_data_headers(
532 p_instance_id,
533 p_from_date,
534 p_to_date,
535 x_cs_id,
536 null);
537
538 end if;
539
540 -- Delete Customer Sales Forecast data
541 if (p_cust_sales_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
542
543 open get_cs_definition_id('MSD_CUSTOMER_SALES_FORECAST');
544 fetch get_cs_definition_id into x_cs_id;
545 close get_cs_definition_id;
546
547
548 delete_cs_data ( p_instance_id,
549 x_cs_id,
550 null,
551 x_from_date,
552 x_to_date );
553
554 purge_int_data_headers(p_instance_id,
555 p_from_date,
556 p_to_date,
557 x_cs_id,
558 null);
559 end if;
560
561
562 /** Delete Custom Data **/
563 if p_cs_data_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG then
564
565 if (p_cs_definition_id is not null) then
566 open get_cs_system_flag(p_cs_definition_id);
567 fetch get_cs_system_flag into x_sys_flag;
568 close get_cs_system_flag;
569 end if;
570
571 if (x_sys_flag = 'I') then
572
573 /* Seeded custom stream can only be deleted one at a time.
574 * Therefore the user must have specified the id of the
575 * stream.
576 */
577
578 if(p_cs_definition_id is not null) then
579
580 delete_cs_data ( p_instance_id,
581 p_cs_definition_id,
582 p_cs_designator,
583 x_from_date,
584 x_to_date );
585
586 purge_int_data_headers(p_instance_id,
587 p_from_date,
588 p_to_date,
589 p_cs_definition_id,
590 p_cs_designator);
591
592 end if;
593
594 else
595
596 delete_cs_data ( p_instance_id,
597 p_cs_definition_id,
598 p_cs_designator,
599 x_from_date,
600 x_to_date );
601
602 purge_cs_data_headers(p_instance_id,
603 p_from_date,
604 p_to_date,
605 p_cs_definition_id,
606 p_cs_designator);
607
608 end if;
609
610 end if;
611
612 /** Delete Currency data **/
613 if (p_curr_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
614 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.CURRENCY_FACT_TABLE;
615 l_final_str := l_delete_from;
616 EXECUTE IMMEDIATE l_final_str;
617
618 /* Analyze Currency Code Fact Tables */
619 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.CURRENCY_FACT_TABLE, null);
620 /* End Analyze Currency Code Fact Tables */
621
622 end if;
623
624 -- Delete UOM data
625 if (p_uom_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
626 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.UOM_FACT_TABLE;
627 l_where := ' where nvl(instance,1) = nvl(''' || p_instance_id || ''',nvl(instance,1))' ;
628 l_final_str := l_delete_from || l_where;
629 EXECUTE IMMEDIATE l_final_str;
630
631 /* Analyze Uom Conversion Fact Tables */
632 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.UOM_FACT_TABLE, null);
633 /* End Analyze Uom Conversion Fact Tables */
634
635 end if;
636
637 -- Delete Time data
638 if (p_time_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
639
640 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.TIME_FACT_TABLE;
641
642 if (p_calendar_code = 'GREGORIAN') then
643
644 l_where := ' where calendar_type = ' || MSD_COMMON_UTILITIES.GREGORIAN_CALENDAR;
645 if(l_date_used = 1) then
646 l_where := l_where || ' and day ' || l_date_where;
647 end if;
648 l_final_str := l_delete_from || l_where;
649 EXECUTE IMMEDIATE l_final_str;
650
651 else
652
653 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
654 l_where := l_where || ' and calendar_code = nvl(:p_calendar_code,calendar_code)' ;
655 if(l_date_used = 1) then
656 l_where := l_where || ' and day ' || l_date_where;
657 end if;
658 l_final_str := l_delete_from || l_where;
659 EXECUTE IMMEDIATE l_final_str using p_calendar_code;
660
661 end if;
662
663 /* Analyze Time Fact Tables */
664 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.TIME_FACT_TABLE, null);
665 /* End Analyze Time Fact Tables */
666
667 end if;
668
669
670 -- Delete Pricing data
671 if (p_pricing_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
672 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.PRICING_FACT_TABLE;
673 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
674 l_where := l_where || ' and price_list_name = nvl(:p_price_list, price_list_name)' ;
675 l_final_str := l_delete_from || l_where;
676 EXECUTE IMMEDIATE l_final_str using p_price_list;
677
678 /* Analyze Pricing Fact Tables */
679 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.PRICING_FACT_TABLE, null);
680 /* End Analyze Pricing Fact Tables */
681
682 end if;
683
684
685 -- Delete Scenario entries data
686 if (p_scn_ent_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
687
688 IF p_revision is not null THEN
689
690 SELECt nvl(max(revision), -999) into l_latest_revision
691 from msd_dp_scenario_revisions
692 where demand_plan_id = p_demand_plan_id and
693 scenario_id = p_scenario_id;
694
695 IF (p_revision = l_latest_revision) THEN
696 b_delete_denorm := TRUE;
697 ELSE
698 b_delete_denorm := FALSE;
699 END IF;
700 END IF;
701
702 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.SCENARIO_ENTRIES_TABLE;
703 l_where := ' where nvl(instance,-999) = nvl(''' || p_instance_id || ''', nvl(instance,-999))' ;
704 l_where := l_where || ' and demand_plan_id = nvl(''' || p_demand_plan_id || ''',demand_plan_id)' ;
705 l_where := l_where || ' and scenario_id = nvl(''' || p_scenario_id || ''',scenario_id)' ;
706 l_where := l_where || ' and revision = nvl(''' || p_revision || ''',revision)' ;
707 l_final_str := l_delete_from || l_where;
708 EXECUTE IMMEDIATE l_final_str;
709
710 l_delete_from := 'delete from msd_dp_scenario_revisions';
711 l_where := ' where demand_plan_id = nvl(''' || p_demand_plan_id || ''',demand_plan_id)' ;
712 l_where := l_where || ' and scenario_id = nvl(''' || p_scenario_id || ''',scenario_id)' ;
713 l_where := l_where || ' and revision = nvl(''' || p_revision || ''',revision)' ;
714 l_final_str := l_delete_from || l_where;
715 EXECUTE IMMEDIATE l_final_str;
716
717 l_delete_from := 'delete from msd_dp_planning_percentages';
718 l_where := ' where demand_plan_id = nvl(''' || p_demand_plan_id || ''',demand_plan_id)' ;
719 l_where := l_where || ' and dp_scenario_id = nvl(''' || p_scenario_id || ''', dp_scenario_id)' ;
720 l_where := l_where || ' and revision = nvl(''' || p_revision || ''',revision)' ;
721 l_where := l_where || ' and nvl(instance,-999) = nvl(''' || p_instance_id || ''', nvl(instance,-999)) ';
722 l_final_str := l_delete_from || l_where;
723 EXECUTE IMMEDIATE l_final_str;
724
725 IF ( p_revision is null or
726 b_delete_denorm = TRUE ) THEN
727
728 l_delete_from := 'delete from msd_dp_scn_entries_denorm ';
729 l_where := ' where nvl(sr_instance_id,-999) = nvl(''' || p_instance_id || ''', nvl(sr_instance_id,-999))' ;
730 l_where := l_where || ' and demand_plan_id = nvl(''' || p_demand_plan_id || ''',demand_plan_id)' ;
731 l_where := l_where || ' and scenario_id = nvl(''' || p_scenario_id || ''',scenario_id) ' ;
732 l_final_str := l_delete_from || l_where;
733 EXECUTE IMMEDIATE l_final_str;
734
735 l_delete_from := 'delete from msd_dp_planning_pct_denorm ';
736 l_where := ' where nvl(sr_instance_id,-999) = nvl(''' || p_instance_id || ''', nvl(sr_instance_id,-999))' ;
737 l_where := l_where || ' and demand_plan_id = nvl(''' || p_demand_plan_id || ''',demand_plan_id)' ;
738 l_where := l_where || ' and dp_scenario_id = nvl(''' || p_scenario_id || ''', dp_scenario_id) ' ;
739 l_final_str := l_delete_from || l_where;
740 EXECUTE IMMEDIATE l_final_str;
741
742 END IF;
743
744 /* Analyze Scenario Entry Fact Tables */
745 MSD_ANALYZE_TABLES.analyze_table(MSD_COMMON_UTILITIES.SCENARIO_ENTRIES_TABLE, null);
746 /* End Analyze Scenario Entry Fact Tables */
747
748
749 end if;
750
751 -- Delete Level value, associations and item attributes data
752 if (p_level_values_yes_no = MSD_COMMON_UTILITIES.MSD_YES_FLAG) then
753 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.LEVEL_VALUES_FACT_TABLE;
754 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
755 l_final_str := l_delete_from || l_where;
756 EXECUTE IMMEDIATE l_final_str;
757
758 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.LEVEL_ASSOC_FACT_TABLE;
759 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
760 l_final_str := l_delete_from || l_where;
761 EXECUTE IMMEDIATE l_final_str;
762
763 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.ITEM_INFO_FACT_TABLE;
764 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
765 l_final_str := l_delete_from || l_where;
766 EXECUTE IMMEDIATE l_final_str;
767
768 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.MSD_LOCAL_ID_SETUP_TABLE;
769 l_where := ' where instance_id = nvl(''' || p_instance_id || ''',instance_id)' ;
770 l_final_str := l_delete_from || l_where;
771 EXECUTE IMMEDIATE l_final_str;
772
773 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.LEVEL_ORG_ASSCNS_FACT_TABLE;
774 l_where := ' where instance = nvl(''' || p_instance_id || ''',instance)' ;
775 l_final_str := l_delete_from || l_where;
776 EXECUTE IMMEDIATE l_final_str;
777
778 l_delete_from := 'delete from ' || MSD_COMMON_UTILITIES.ITEM_RELATIONSHIPS_FACT_TABLE;
779 l_where := ' where instance_id = nvl(''' || p_instance_id || ''',instance_id)' ;
780 l_final_str := l_delete_from || l_where;
781 EXECUTE IMMEDIATE l_final_str;
782
783
784 /* Added for Deleting Stripes Data */
785 delete from msd_level_values_ds;
786
787 delete from msd_dp_parameters_ds;
788
789 delete from msd_cs_data_ds;
790
791 update msd_demand_plans
792 set build_stripe_level_pk = null,
793 build_stripe_stream_name = null,
794 build_stripe_stream_desig = null,
795 build_stripe_stream_ref_num = null;
796
797 /* End Deleting Stripes Data */
798
799 /* Analyze Level Value Fact Tables */
800 MSD_ANALYZE_TABLES.analyze_table(null,2);
801 /* End Analyze Level Value Fact Tables */
802
803 end if;
804
805 commit;
806
807
808 exception
809 when others then
810 errbuf := substr(SQLERRM,1,150);
811 retcode := -1 ;
812
813 end purge_facts;
814
815 PROCEDURE purge_custom_stream_data(errbuf OUT nocopy VARCHAR2, retcode OUT nocopy VARCHAR2) IS
816
817 CURSOR min_refresh_numbers IS
818 SELECT MIN(mdp.scn_build_refresh_num) ref_num,
819 mcd.cs_definition_id csid,
820 mcd.name csname
821 FROM msd_dp_parameters mdp,
822 msd_cs_definitions mcd
823 WHERE mcd.name = mdp.parameter_type
824 GROUP BY mcd.cs_definition_id,
825 mcd.name
826 ORDER BY mcd.cs_definition_id;
827
828 cs_def_id NUMBER;
829
830 CURSOR set_refresh_numbers IS
831 SELECT COUNT(*) deleted_rec,
832 cs_definition_id csid,
833 last_refresh_num l_ref_num,
834 action_code
835 FROM msd_cs_data
836 GROUP BY cs_definition_id,
837 last_refresh_num,
838 action_code HAVING action_code = 'D'
839 AND cs_definition_id = cs_def_id
840 ORDER BY last_refresh_num;
841
842 l_sql_stmt VARCHAR2(4000);
843 lv_error_text VARCHAR2(300);
844
845 set_rec set_refresh_numbers % rowtype;
846 deleted NUMBER;
847
848 BEGIN
849 fnd_file.PUT_LINE(fnd_file.LOG, ' ');
850 fnd_file.PUT_LINE(fnd_file.LOG, '+---------------------------------------------------------------------------+');
851 fnd_file.PUT_LINE(fnd_file.LOG, '+--------------Entering the procedure purge_custom_data_stream--------------+');
852
853 FOR rec IN min_refresh_numbers
854 LOOP
855
856 IF rec.ref_num IS NOT NULL
857 AND rec.csid IS NOT NULL THEN
858
859 cs_def_id := rec.csid;
860 deleted := 0;
861
862 OPEN set_refresh_numbers;
863 LOOP
864 FETCH set_refresh_numbers
865 INTO set_rec;
866
867 IF set_rec.l_ref_num <= rec.ref_num THEN
868
869 l_sql_stmt := ' DELETE FROM MSD_CS_DATA' || ' WHERE ACTION_CODE = ' || '''D''' || ' and LAST_REFRESH_NUM = ' || set_rec.l_ref_num || ' and cs_definition_id = ' || rec.csid;
870
871 EXECUTE IMMEDIATE l_sql_stmt;
872
873 IF fnd_profile.VALUE('MRP_DEBUG_MODE') = 'Y' THEN
874 fnd_file.PUT_LINE(fnd_file.LOG, l_sql_stmt);
875 END IF;
876
877 COMMIT;
878
879 --fnd_file.PUT_LINE(fnd_file.LOG, l_sql_stmt);
880 deleted := deleted + set_rec.deleted_rec;
881
882 END IF;
883
884 EXIT
885 WHEN set_refresh_numbers % NOTFOUND;
886 END LOOP;
887
888 CLOSE set_refresh_numbers;
889
890 IF deleted > 0 THEN
891 fnd_file.PUT_LINE(fnd_file.LOG, to_char(deleted) || ' unused records purged for the custom stream - ' || rec.csname);
892
893 END IF;
894
895 END IF;
896
897 END LOOP;
898
899 fnd_file.PUT_LINE(fnd_file.LOG, '+-------------Exiting from the procedure purge_custom_data_stream-----------+');
900 fnd_file.PUT_LINE(fnd_file.LOG, '+---------------------------------------------------------------------------+');
901 fnd_file.PUT_LINE(fnd_file.LOG, ' ');
902
903 EXCEPTION
904 WHEN others THEN
905 lv_error_text := SUBSTR(sqlerrm, 1, 240);
906 fnd_file.PUT_LINE(fnd_file.LOG, 'Error while purging unused custom stream data');
907 fnd_file.PUT_LINE(fnd_file.LOG, lv_error_text);
908 retcode := -1;
909
910 END purge_custom_stream_data;
911
912 END MSD_PURGE ;
913