DBA Data[Home] [Help]

PACKAGE BODY: APPS.PV_CATEGORY_MIGRATION

Source


1 PACKAGE BODY PV_CATEGORY_MIGRATION AS
2 /* $Header: pvsphmib.pls 120.0 2005/05/27 15:25:11 appldev noship $ */
3 
4 /*************************************************************************************/
5 /*                                                                                   */
6 /*                                                                                   */
7 /*                                                                                   */
8 /*                    Global Variable Declaration                                    */
9 /*                                                                                   */
10 /*                                                                                   */
11 /*                                                                                   */
12 /*************************************************************************************/
13 g_log_to_file        VARCHAR2(5)  := 'Y';
14 g_pkg_name           VARCHAR2(30) := 'PV_CATEGORY_MIGRATION';
15 g_api_name           VARCHAR2(30);
16 
17 
18 
19 /*************************************************************************************/
20 /*                                                                                   */
21 /*                                                                                   */
22 /*                                                                                   */
23 /*                    private procedure declaration                                  */
24 /*                                                                                   */
25 /*                                                                                   */
26 /*                                                                                   */
27 /*************************************************************************************/
28 PROCEDURE Debug(
29    p_msg_string      IN VARCHAR2,
30    p_msg_type        IN VARCHAR2 := 'PV_DEBUG_MESSAGE',
31    p_token_type      IN VARCHAR2 := 'TEXT',
32    p_statement_level IN NUMBER   := FND_LOG.LEVEL_PROCEDURE
33 );
34 
35 PROCEDURE Set_Message(
36     p_msg_name      IN      VARCHAR2,
37     p_token1        IN      VARCHAR2 := NULL,
38     p_token1_value  IN      VARCHAR2 := NULL,
39     p_token2        IN      VARCHAR2 := NULL,
40     p_token2_value  IN      VARCHAR2 := NULL,
41     p_token3        IN      VARCHAR2 := NULL,
42     p_token3_value  IN      VARCHAR2 := NULL,
43     p_statement_level IN NUMBER   := FND_LOG.LEVEL_PROCEDURE
44 );
45 
46 
47 --=============================================================================+
48 --| Public Procedure                                                           |
49 --|    Category_Migration                                                      |
50 --|                                                                            |
51 --| Purpose                                                                    |
52 --|    This script is used to migrate pv_enty_attr_values and                  |
53 --|    pv_selected_attr_values to single product hierarchy.                    |
54 --|                                                                            |
55 --|                                                                            |
56 --| NOTES                                                                      |
57 --|                                                                            |
58 --| HISTORY                                                                    |
59 --|                                                                            |
60 --==============================================================================
61 
62 PROCEDURE Category_Migration (
63     ERRBUF             OUT NOCOPY VARCHAR2,
64     RETCODE            OUT NOCOPY VARCHAR2,
65     p_trace_mode       IN  VARCHAR2,
66     p_log_to_file      IN  VARCHAR2 := 'Y')
67 IS
68    l_status               BOOLEAN;
69    l_no_data_found        BOOLEAN := TRUE;
70    l_string               VARCHAR2(300);
71    l_update_ddl           VARCHAR2(4000);
72    l_pv_schema            VARCHAR2(30);
73    l_index_tablespace     VARCHAR2(30);
74    l_rows_inserted        NUMBER;
75    l_revert_entity_attr   BOOLEAN := FALSE;
76    l_revert_selected_attr BOOLEAN := FALSE;
77 
78 
79    CURSOR c_enty_attr_values IS
80       SELECT DISTINCT
81              b.code old_value, b.product_category_id
82       FROM   pv_enty_attr_values a,
83       (
84       select interest_type code,
85              TO_CHAR(interest_type_id) id,
86              product_category_id
87       from   as_interest_types_vl
88       union
89       select i.interest_type ||'/'||p.code code,
90              i.interest_type_id ||'/'||p.interest_code_id id,
91              p.product_category_id
92       from   as_interest_types_vl i, as_interest_codes_vl p
93       where  i.interest_type_id*1 = p.interest_type_id and
94              p.parent_interest_code_id is null
95       union
96       select i.interest_type ||'/'||p.code ||'/'||s.code code,
97              i.interest_type_id ||'/'||p.interest_code_id ||'/'||s.interest_code_id id,
98              s.product_category_id
99       from   as_interest_types_vl i, as_interest_codes_vl p,
100              as_interest_codes_vl s
101       where  i.interest_type_id = p.interest_type_id and
102              p.interest_type_id = s.interest_type_id*1 and
103              s.parent_interest_code_id = p.interest_code_id
104       ) b
105       WHERE  a.attr_value = b.id AND
106              a.attribute_id IN (1, 510) AND
107              b.product_category_id IS NULL;
108 
109 
110    CURSOR c_selected_attr_values IS
111       SELECT  DISTINCT
112               a.attribute_value old_value
113       FROM    pv_selected_attr_values a,
114               pv_enty_select_criteria c,
115       (
116       select interest_type code,
117              TO_CHAR(interest_type_id) id,
118              product_category_id
119       from   as_interest_types_vl
120       union
121       select i.interest_type ||'/'||p.code code,
122              i.interest_type_id ||'/'||p.interest_code_id id,
123              p.product_category_id
124       from   as_interest_types_vl i, as_interest_codes_vl p
125       where  i.interest_type_id*1 = p.interest_type_id and
126              p.parent_interest_code_id is null
127       union
128       select i.interest_type ||'/'||p.code ||'/'||s.code code,
129              i.interest_type_id ||'/'||p.interest_code_id ||'/'||s.interest_code_id id,
130              s.product_category_id
131       from   as_interest_types_vl i, as_interest_codes_vl p,
132              as_interest_codes_vl s
133       where  i.interest_type_id = p.interest_type_id and
134              p.interest_type_id = s.interest_type_id*1 and
135              s.parent_interest_code_id = p.interest_code_id
136       ) b
137       WHERE  b.id = a.attribute_value AND
138              a.selectioN_criteria_id    = c.selection_criteria_id AND
139              c.attribute_id IN (1, 510) AND
140              b.product_category_id IS NULL;
141 
142 
143    l_insert_into_table1 VARCHAR2(32000) :=
144      'INSERT INTO pv_single_prod_h_mappings
145       SELECT a.enty_attr_val_id,
146              b.product_category_id new_value,
147              b.code old_value
148       FROM   pv_enty_attr_values a,
149       (
150             select to_char(interest_type_id) code, product_category_id
151             from   as_interest_types_b
152             union
153             select to_char(i.interest_type_id)||''/''||p.interest_code_id code,
154                    p.product_category_id
155             from   as_interest_types_b i, as_interest_codes_b p
156             where  i.interest_type_id*1 = p.interest_type_id and
157                    p.parent_interest_code_id is null
158       union
159       select to_char(i.interest_type_id)||''/''||p.interest_code_id||''/''||
160              s.interest_code_id code,
161              s.product_category_id
162       from   as_interest_types_b i, as_interest_codes_b p, as_interest_codes_b s
163       where  i.interest_type_id = p.interest_type_id and
164              p.interest_type_id = s.interest_type_id*1 and
165              s.parent_interest_code_id = p.interest_code_id
166       ) b
167       WHERE  a.attr_value = b.code AND
168              a.attribute_id IN (1, 510)';
169 
170    l_insert_into_table2 VARCHAR2(32000) :=
171      'INSERT INTO pv_single_prod_h_mappings2
172       SELECT  a.attr_value_id,
173               b.product_category_id new_value,
174               a.attribute_value old_value
175       FROM    pv_selected_attr_values a,
176               pv_enty_select_criteria c,
177       (
178       select to_char(interest_type_id) code, product_category_id
179       from   as_interest_types_b
180       union
181       select to_char(i.interest_type_id)||''/''||p.interest_code_id code,
182              p.product_category_id
183       from   as_interest_types_b i, as_interest_codes_b p
184       where  i.interest_type_id*1 = p.interest_type_id and
185              p.parent_interest_code_id is null
186       union
187       select to_char(i.interest_type_id)||''/''||p.interest_code_id||''/''||
188              s.interest_code_id code,
189              s.product_category_id
190       from   as_interest_types_b i, as_interest_codes_b p, as_interest_codes_b s
191       where  i.interest_type_id = p.interest_type_id and
192              p.interest_type_id = s.interest_type_id*1 and
193             s.parent_interest_code_id = p.interest_code_id
194       ) b
195       WHERE  b.code = a.attribute_value AND
196              a.selectioN_criteria_id    = c.selection_criteria_id AND
197              c.attribute_id IN (1, 510)';
198 
199    -- -----------------------------------------------------------------------------
200    -- This cursor is used for retrieving PV schema.
201    -- -----------------------------------------------------------------------------
202    CURSOR c_pv_schema IS
203       SELECT i.tablespace,
204              i.index_tablespace,
205              u.oracle_username
206       FROM   fnd_product_installations i,
207              fnd_application a,
208              fnd_oracle_userid u
209       WHERE  a.application_short_name = 'PV' AND
210              a.application_id = i.application_id AND
211              u.oracle_id = i.oracle_id;
212 
213 BEGIN
214    -- ----------------------------------------------------------------------------
215    -- Initialize variables.
216    -- ----------------------------------------------------------------------------
217    IF p_trace_mode = 'Y' THEN
218        dbms_session.set_sql_trace(TRUE);
219    ELSE
220        dbms_session.set_sql_trace(FALSE);
221    END IF;
222 
223    IF (p_log_to_file <> 'Y') THEN
224       g_log_to_file := 'N';
225    ELSE
226       g_log_to_file := 'Y';
227    END IF;
228 
229    g_api_name := 'Category_Migration';
230 
231 
232    -- ----------------------------------------------------------------------------
233    -- Starts migration.
234    -- ----------------------------------------------------------------------------
235 
236    -- -----------------------------------------------------------------------
237    -- Revert Single Product Hierarchy back to Sales Product Hierarchy.
238    -- This is to ensure that this concurrent program is re-runnable.
239    -- -----------------------------------------------------------------------
240    Debug('(1).');
241    Set_Message(
242       p_msg_name      => 'PV_SPH_REVERT_BACK'
243    );
244 
245    FOR x IN (SELECT 'x' row_exists FROM pv_single_prod_h_mappings) LOOP
246       l_revert_entity_attr := TRUE;
247    END LOOP;
248 
249    FOR x IN (SELECT 'x' row_exists FROM pv_single_prod_h_mappings2) LOOP
250       l_revert_selected_attr := TRUE;
251    END LOOP;
252 
253    -- -----------------------------------------------------------------------
254    -- pv_enty_attr_values: revert back to Sales Product Hierarchy.
255    -- -----------------------------------------------------------------------
256    IF (l_revert_entity_attr) THEN
257      l_update_ddl :=
258      'UPDATE pv_enty_attr_values a
259       SET    attr_value = (SELECT old_value
260                            FROM   pv_single_prod_h_mappings b
261                            WHERE  a.enty_attr_val_id = b.enty_attr_val_id)
262       WHERE  EXISTS       (SELECT 1
263                            FROM   pv_single_prod_h_mappings c
264                            WHERE  a.enty_attr_val_id = c.enty_attr_val_id)';
265 
266       l_string := SUBSTR(l_update_ddl, 1, 300);
267 
268       EXECUTE IMMEDIATE l_update_ddl;
269 
270       Set_Message(
271          p_msg_name      => 'PV_SPH_ROWS_UPDATED',
272          p_token1        => 'ROWS',
273          p_token1_value  => SQL%ROWCOUNT
274       );
275 
276    END IF;
277 
278 
279    -- -----------------------------------------------------------------------
280    -- pv_selected_attr_values: revert back to Sales Product Hierarchy.
281    -- -----------------------------------------------------------------------
282    IF (l_revert_selected_attr) THEN
283      l_update_ddl :=
284      'UPDATE pv_selected_attr_values a
285       SET    attribute_value =
286                           (SELECT old_value
287                            FROM   pv_single_prod_h_mappings2 b
288                            WHERE  a.attr_value_id = b.attr_value_id)
289       WHERE  EXISTS       (SELECT 1
290                            FROM   pv_single_prod_h_mappings2 c
291                            WHERE  a.attr_value_id = c.attr_value_id)';
292 
293       l_string := SUBSTR(l_update_ddl, 1, 300);
294 
295       EXECUTE IMMEDIATE l_update_ddl;
296 
297       Set_Message(
298          p_msg_name      => 'PV_SPH_ROWS_UPDATED',
299          p_token1        => 'ROWS',
300          p_token1_value  => SQL%ROWCOUNT
301       );
302    END IF;
303 
304    -- -----------------------------------------------------------------------
305    -- Check if all the data in pv_enty_attr_values have proper mapping.
306    -- -----------------------------------------------------------------------
307    l_no_data_found := TRUE;
308 
309    Debug('-');
310    Debug('-');
311    Debug('(2).');
312    Set_Message(
313       p_msg_name      => 'PV_SPH_NO_MAPPING',
314       p_token1        => 'TABLE',
315       p_token1_value  => 'pv_enty_attr_values'
316    );
317    Debug('-');
318    Debug('------------------------------------------------------------');
319 
320    FOR x IN c_enty_attr_values LOOP
321       Debug(LPAD(x.old_value, 60));
322       l_no_data_found := FALSE;
323    END LOOP;
324 
325    IF (l_no_data_found) THEN
326       Debug('-');
327       Debug('-');
328       Set_Message(
329          p_msg_name      => 'PV_SPH_NO_ROWS_RETURNED'
330       );
331       Debug('-');
332 
333    ELSE
334       Debug('-');
335       Debug('-');
336       Set_Message(
337          p_msg_name      => 'PV_SPH_OPERATION_ABORTED'
338       );
339       Debug('-');
340       Debug('-');
341 
342       RETCODE := '1';
343 
344       RETURN;
345    END IF;
346 
347 
348    Debug('-');
349    Debug('-');
350    Debug('(3).');
351    Set_Message(
352       p_msg_name      => 'PV_SPH_NO_MAPPING',
353       p_token1        => 'TABLE',
354       p_token1_value  => 'pv_selected_attr_values'
355    );
356    Debug('-');
357    Debug('------------------------------------------------------------');
358    Debug('-');
359    Debug('-');
360 
361    FOR x IN c_selected_attr_values LOOP
362       Debug(LPAD(x.old_value, 60));
363       l_no_data_found := FALSE;
364    END LOOP;
365 
366    IF (l_no_data_found) THEN
367       Set_Message(
368          p_msg_name      => 'PV_SPH_NO_ROWS_RETURNED'
369       );
370       Debug('-');
371 
372    ELSE
373       Debug('-');
374       Debug('-');
375       Set_Message(
376          p_msg_name      => 'PV_SPH_OPERATION_ABORTED'
377       );
378       Debug('-');
379       Debug('-');
380 
381       RETCODE := '1';
382 
383       RETURN;
384    END IF;
385 
386 
387    Debug('-');
388    Debug('-');
389    Debug('==============================================================');
390    Set_Message(
391       p_msg_name      => 'PV_SPH_DATA_VALIDATION_DONE'
392    );
393    Debug('==============================================================');
394    Debug('-');
395    Debug('-');
396 
397    Debug('(4).');
398 
399    Set_Message(
400       p_msg_name      => 'PV_SPH_POPULATE_MAPPING',
401       p_token1        => 'TABLE1',
402       p_token1_value  => 'pv_single_prod_h_mappings',
403       p_token2        => 'TABLE2',
404       p_token2_value  => 'pv_enty_attr_values'
405    );
406 
407    Debug('-');
408 
409    -- -------------------------------------------------------------------------
410    -- Retrieve PV schema name. The schema for PV may not always be "PV". It
411    -- depends on the implementation. Hence, we can't hard code the name.
412    -- -------------------------------------------------------------------------
413    FOR x IN c_pv_schema LOOP
414       l_pv_schema        := x.oracle_username;
415       l_index_tablespace := x.index_tablespace;
416    END LOOP;
417 
418 
419    BEGIN
420       l_string := 'DROP INDEX ' || l_pv_schema || '.pv_single_prod_h_mappings_u1';
421       EXECUTE IMMEDIATE l_string;
422 
423       EXCEPTION
424          WHEN OTHERS THEN
425             null;
426    END;
427 
428    l_string := 'TRUNCATE TABLE ' || l_pv_schema || '.pv_single_prod_h_mappings';
429    EXECUTE IMMEDIATE l_string;
430 
431    l_string := SUBSTR(l_insert_into_table1, 1, 300);
432    EXECUTE IMMEDIATE l_insert_into_table1;
433 
434    l_rows_inserted := SQL%ROWCOUNT;
435 
436    Set_Message(
437       p_msg_name      => 'PV_SPH_ROWS_INSERTED',
438       p_token1        => 'ROWS',
439       p_token1_value  => l_rows_inserted
440    );
441 
442    l_string := 'CREATE UNIQUE INDEX ' || l_pv_schema ||
443                '.pv_single_prod_h_mappings_u1 ' ||
444                'ON pv_single_prod_h_mappings (enty_attr_val_id) ' ||
445                'TABLESPACE ' || l_index_tablespace;
446    EXECUTE IMMEDIATE l_string;
447 
448    l_string := 'ANALYZE TABLE ' || l_pv_schema ||
449                '.pv_single_prod_h_mappings COMPUTE STATISTICS';
450    EXECUTE IMMEDIATE l_string;
451 
452 
453 
454    Debug('-');
455    Debug('(5).');
456    Set_Message(
457       p_msg_name      => 'PV_SPH_POPULATE_MAPPING',
458       p_token1        => 'TABLE1',
459       p_token1_value  => 'pv_single_prod_h_mappings2',
460       p_token2        => 'TABLE2',
461       p_token2_value  => 'pv_selected_attr_values'
462    );
463 
464    Debug('-');
465 
466    BEGIN
467       l_string := 'DROP INDEX ' || l_pv_schema || '.pv_single_prod_h_mappings2_u1';
468       EXECUTE IMMEDIATE l_string;
469 
470       EXCEPTION
471          WHEN OTHERS THEN
472             null;
473    END;
474 
475 
476    l_string := 'TRUNCATE TABLE ' || l_pv_schema || '.pv_single_prod_h_mappings2';
477    EXECUTE IMMEDIATE l_string;
478 
479 
480    l_string := SUBSTR(l_insert_into_table2, 1, 300);
481    EXECUTE IMMEDIATE l_insert_into_table2;
482 
483    l_rows_inserted := SQL%ROWCOUNT;
484    Set_Message(
485       p_msg_name      => 'PV_SPH_ROWS_INSERTED',
486       p_token1        => 'ROWS',
487       p_token1_value  => l_rows_inserted
488    );
489 
490 
491    l_string := 'CREATE UNIQUE INDEX ' || l_pv_schema ||
492                '.pv_single_prod_h_mappings2_u1 ' ||
493                'ON pv_single_prod_h_mappings2 (attr_value_id) ' ||
494                'TABLESPACE ' || l_index_tablespace;
495    EXECUTE IMMEDIATE l_string;
496 
497    l_string := 'ANALYZE TABLE ' || l_pv_schema ||
498                '.pv_single_prod_h_mappings2 COMPUTE STATISTICS';
499    EXECUTE IMMEDIATE l_string;
500 
501    Debug('-');
502 
503 
504    -- -----------------------------------------------------------------------
505    -- Update pv_enty_attr_values
506    -- -----------------------------------------------------------------------
507    Debug('(6).');
508    Set_Message(
509       p_msg_name      => 'PV_SPH_UPDATE_TABLE',
510       p_token1        => 'TABLE',
511       p_token1_value  => 'pv_enty_attr_values'
512    );
513    Debug('-');
514 
515    l_update_ddl :=
516      'UPDATE pv_enty_attr_values a
517       SET    attr_value = (SELECT new_value
518                            FROM   pv_single_prod_h_mappings b
519                            WHERE  a.enty_attr_val_id = b.enty_attr_val_id)
520       WHERE  EXISTS       (SELECT 1
521                            FROM   pv_single_prod_h_mappings c
522                            WHERE  a.enty_attr_val_id = c.enty_attr_val_id)';
523 
524    l_string := SUBSTR(l_update_ddl, 1, 300);
525 
526    EXECUTE IMMEDIATE l_update_ddl;
527 
528    Set_Message(
529       p_msg_name      => 'PV_SPH_ROWS_UPDATED',
530       p_token1        => 'ROWS',
531       p_token1_value  => SQL%ROWCOUNT
532    );
533    Debug('-');
534    Debug('-');
535 
536 
537    -- -----------------------------------------------------------------------
538    -- Update pv_selected_attr_values
539    -- -----------------------------------------------------------------------
540    Debug('(7).');
541    Set_Message(
542       p_msg_name      => 'PV_SPH_UPDATE_TABLE',
543       p_token1        => 'TABLE',
544       p_token1_value  => 'pv_selected_attr_values'
545    );
546    Debug('-');
547 
548    l_update_ddl :=
549      'UPDATE pv_selected_attr_values a
550       SET    attribute_value =
551                           (SELECT new_value
552                            FROM   pv_single_prod_h_mappings2 b
553                            WHERE  a.attr_value_id = b.attr_value_id)
554       WHERE  EXISTS       (SELECT 1
555                            FROM   pv_single_prod_h_mappings2 c
556                            WHERE  a.attr_value_id = c.attr_value_id)';
557 
558    l_string := SUBSTR(l_update_ddl, 1, 300);
559 
560    EXECUTE IMMEDIATE l_update_ddl;
561 
562    Set_Message(
563       p_msg_name      => 'PV_SPH_ROWS_UPDATED',
564       p_token1        => 'ROWS',
565       p_token1_value  => SQL%ROWCOUNT
566    );
567    Debug('-');
568    Debug('-');
569 
570 
571 
572    Set_Message(
573       p_msg_name      => 'PV_SPH_MIGRATION_COMPLETED'
574    );
575    Debug('-');
576    Set_Message(
577       p_msg_name      => 'PV_SPH_VIEW_MAPPING_TABLE',
578       p_token1        => 'TABLE1',
579       p_token1_value  => 'pv_enty_attr_values',
580       p_token2        => 'TABLE2',
581       p_token2_value  => 'pv_single_prod_h_mappings'
582    );
583 
584    Debug('-');
585    Debug('SELECT old_value, new_value');
586    Debug('FROM   pv_single_prod_h_mappings;');
587    Debug('-');
588    Debug('-');
589 
590    Set_Message(
591       p_msg_name      => 'PV_SPH_VIEW_MAPPING_TABLE',
592       p_token1        => 'TABLE1',
593       p_token1_value  => 'pv_selected_attr_values',
594       p_token2        => 'TABLE2',
595       p_token2_value  => 'pv_single_prod_h_mappings2'
596    );
597 
598    Debug('-');
599    Debug('SELECT old_value, new_value');
600    Debug('FROM   pv_single_prod_h_mappings2;');
601    Debug('-');
602    Debug('-');
603 
604 
605    EXCEPTION
606       WHEN OTHERS THEN
607          Debug('Exception raised while running the script...');
608          Debug('SQLCODE : ' || SQLCODE);
609          Debug('SQLERRM : ' || SQLERRM);
610          Debug('-');
611          Debug('Error encountered while executing the following statement:');
612          Debug(l_string);
613          Debug('-');
614          Debug('-');
615 
616          errbuf   := SQLERRM;
617          retcode  := FND_API.G_RET_STS_UNEXP_ERROR;
618          l_status := FND_CONCURRENT.SET_COMPLETION_STATUS('ERROR', SQLERRM);
619 
620 END CATEGORY_MIGRATION;
621 
622 
623 
624 --=============================================================================+
625 --|  Private Procedure                                                         |
626 --|                                                                            |
627 --|    Debug                                                                   |
628 --|                                                                            |
629 --|  Parameters                                                                |
630 --|  IN                                                                        |
631 --|  OUT                                                                       |
632 --|                                                                            |
633 --|                                                                            |
634 --| NOTES:                                                                     |
635 --|                                                                            |
636 --| HISTORY                                                                    |
637 --|                                                                            |
638 --==============================================================================
639 PROCEDURE Debug(
640    p_msg_string      IN VARCHAR2,
641    p_msg_type        IN VARCHAR2 := 'PV_DEBUG_MESSAGE',
642    p_token_type      IN VARCHAR2 := 'TEXT',
643    p_statement_level IN NUMBER   := FND_LOG.LEVEL_PROCEDURE
644 )
645 IS
646 BEGIN
647    FND_MESSAGE.Set_Name('PV', p_msg_type);
648    FND_MESSAGE.Set_Token(p_token_type, p_msg_string);
649 
650    IF (g_log_to_file = 'N') THEN
651       FND_MSG_PUB.Add;
652 
653    ELSIF (g_log_to_file = 'Y') THEN
654       FND_FILE.PUT_LINE( FND_FILE.LOG,  fnd_message.get );
655    END IF;
656 
657    IF (p_statement_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
658       FND_LOG.STRING(p_statement_level,
659          'pv.plsql.' || g_pkg_name || '.' || g_api_name,
660          p_msg_string
661       );
662    END IF;
663 END Debug;
664 -- =================================End of Debug================================
665 
666 --=============================================================================+
667 --|  Public Procedure                                                          |
668 --|                                                                            |
669 --|    Set_Message                                                             |
670 --|                                                                            |
671 --|  Parameters                                                                |
672 --|  IN                                                                        |
673 --|  OUT                                                                       |
674 --|                                                                            |
675 --|                                                                            |
676 --| NOTES:                                                                     |
677 --|                                                                            |
678 --| HISTORY                                                                    |
679 --|                                                                            |
680 --==============================================================================
681 PROCEDURE Set_Message(
682     p_msg_name      IN      VARCHAR2,
683     p_token1        IN      VARCHAR2 := NULL,
684     p_token1_value  IN      VARCHAR2 := NULL,
685     p_token2        IN      VARCHAR2 := NULL,
686     p_token2_value  IN      VARCHAR2 := NULL,
687     p_token3        IN      VARCHAR2 := NULL,
688     p_token3_value  IN      VARCHAR2 := NULL,
689     p_statement_level IN NUMBER   := FND_LOG.LEVEL_PROCEDURE
690 )
691 IS
692 BEGIN
693    FND_MESSAGE.Set_Name('PV', p_msg_name);
694 
695    IF (p_token1 IS NOT NULL) THEN
696       FND_MESSAGE.Set_Token(p_token1, p_token1_value);
697    END IF;
698 
699    IF (p_token2 IS NOT NULL) THEN
700       FND_MESSAGE.Set_Token(p_token2, p_token2_value);
701    END IF;
702 
703    IF (p_token3 IS NOT NULL) THEN
704       FND_MESSAGE.Set_Token(p_token3, p_token3_value);
705    END IF;
706 
707    IF (p_statement_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
708       FND_LOG.MESSAGE(
709          p_statement_level,
710          'pv.plsql.' || g_pkg_name || '.' || g_api_name,
711          FALSE
712       );
713    END IF;
714 
715    IF (g_log_to_file = 'N') THEN
716       FND_MSG_PUB.Add;
717 
718    ELSIF (g_log_to_file = 'Y') THEN
719       FND_FILE.PUT_LINE(FND_FILE.LOG,  fnd_message.get);
720    END IF;
721 
722 END Set_Message;
723 -- ==============================End of Set_Message==============================
724 
725 
726 end PV_CATEGORY_MIGRATION;