DBA Data[Home] [Help]

PACKAGE BODY: APPS.XLA_CMP_COMMON_PKG

Source


1 PACKAGE BODY xla_cmp_common_pkg AS
2 /* $Header: xlacpcom.pkb 120.3 2006/06/16 00:55:17 jlarre ship $ */
3 /*======================================================================+
4 |             Copyright (c) 1995-2002 Oracle Corporation                |
5 |                       Redwood Shores, CA, USA                         |
6 |                         All rights reserved.                          |
7 +=======================================================================+
8 | PACKAGE NAME                                                          |
9 |    xla_cmp_lock_pkg                                                   |
10 |                                                                       |
11 | DESCRIPTION                                                           |
12 |    Oracle Subledger Accounting Compiler Common Code                   |
13 |                                                                       |
14 | HISTORY                                                               |
15 |    30-JAN-04 A.Quaglia      Created                                   |
16 |    15-MAY-2006 Jorge Larre  Fix for bug 5330846. This is a temporary  |
17 |       fix until we get a confirmation from the ATG team that there    |
18 |       will only be one row in fnd_oracle_userid to retrieve the schema|
19 |       name with read_only_flag = 'U'. In this temporary fix we assume |
20 |       that the install_group_num is 1 (this is correct in the internal|
21 |       databases).                                                     |
22 |                                                                       |
23 +======================================================================*/
24 
25    -- Private Constants
26    G_MAX_PACKAGE_LINE_LENGTH CONSTANT INTEGER := 255;
27    G_CHR_QUOTE               CONSTANT VARCHAR2(9)   :='''';
28    G_CHR_SPACE               CONSTANT VARCHAR2(9)   :=' ';
29    G_CHR_NEWLINE             CONSTANT VARCHAR2(10)  := xla_environment_pkg.g_chr_newline;
30 
31 
32    --
33    -- Private exceptions
34    --
35    le_resource_busy                   EXCEPTION;
39    --
36    PRAGMA exception_init(le_resource_busy, -00054);
37 
38    le_fatal_error                     EXCEPTION;
40    -- Private types
41    --
42 
43    --
44    -- Private constants
45    --
46 
47    --
48    -- Global variables
49    --
50    g_user_id                 INTEGER := xla_environment_pkg.g_usr_id;
51    g_login_id                INTEGER := xla_environment_pkg.g_login_id;
52    g_date                    DATE    := SYSDATE;
53    g_prog_appl_id            INTEGER := xla_environment_pkg.g_prog_appl_id;
54    g_prog_id                 INTEGER := xla_environment_pkg.g_prog_id;
55    g_req_id                  INTEGER := NVL(xla_environment_pkg.g_req_id, -1);
56 
57    --
58 
59    -- Cursor declarations
60    --
61 
62 
63 
64 --=============================================================================
65 --               *********** Local Trace Routine **********
66 --=============================================================================
67 C_LEVEL_STATEMENT     CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
68 C_LEVEL_PROCEDURE     CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
69 C_LEVEL_EVENT         CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
70 C_LEVEL_EXCEPTION     CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
71 C_LEVEL_ERROR         CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
72 C_LEVEL_UNEXPECTED    CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
73 
74 C_LEVEL_LOG_DISABLED  CONSTANT NUMBER := 99;
75 C_DEFAULT_MODULE      CONSTANT VARCHAR2(240) := 'xla.plsql.xla_cmp_common_pkg';
76 
77 g_log_level           NUMBER;
78 g_log_enabled         BOOLEAN;
79 
80 --1-STATEMENT, 2-PROCEDURE, 3-EVENT, 4-EXCEPTION, 5-ERROR, 6-UNEXPECTED
81 
82 PROCEDURE trace
83        ( p_module                     IN VARCHAR2 DEFAULT C_DEFAULT_MODULE
84         ,p_msg                        IN VARCHAR2
85         ,p_level                      IN NUMBER
86         ) IS
87 
88 BEGIN
89    IF (p_msg IS NULL AND p_level >= g_log_level) THEN
90       fnd_log.message(p_level, p_module);
91    ELSIF p_level >= g_log_level THEN
92       fnd_log.string(p_level, p_module, p_msg);
93    END IF;
94 
95 EXCEPTION
96    WHEN xla_exceptions_pkg.application_exception THEN
97       RAISE;
98    WHEN OTHERS THEN
99       xla_exceptions_pkg.raise_message
100          (p_location   => 'xla_cmp_common_pkg.trace');
101 END trace;
102 
103 
104 FUNCTION get_application_info
105                   ( p_application_id       IN            NUMBER
106                    ,p_application_info     OUT NOCOPY    lt_application_info
107                   )
108 RETURN BOOLEAN
109 IS
110    l_application_name       VARCHAR2(10);
111    l_application_short_name VARCHAR2(50);
112    l_product_short_name     VARCHAR2(10);
113 l_log_module                 VARCHAR2 (2000);
114 
115 BEGIN
116    IF g_log_enabled THEN
117       l_log_module := C_DEFAULT_MODULE||'.get_application_info';
118    END IF;
119 
120    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
121       trace
122          (p_msg      => 'BEGIN ' || l_log_module
123          ,p_level    => C_LEVEL_PROCEDURE);
124    END IF;
125 
126    --Select application info from FND and AD tables
127    SELECT fap.application_id
128          ,fav.application_name
129          ,fap.application_short_name
130          ,fou.oracle_username
131          ,UPPER(adp.product_abbreviation)
132          ,fou_apps.oracle_username
133      INTO p_application_info.application_id
134          ,p_application_info.application_name
135          ,p_application_info.application_short_name
136          ,p_application_info.oracle_username
137          ,p_application_info.product_abbreviation
138          ,p_application_info.apps_account
139      FROM fnd_application           fap
140          ,fnd_application_vl        fav
141          ,fnd_product_installations fpi
142          ,fnd_oracle_userid         fou
143          ,ad_pm_product_info        adp
144          ,fnd_oracle_userid         fou_apps
145     WHERE fap.application_id       =  p_application_id
146       AND fav.application_id       =  fap.application_id
147       AND fpi.application_id       =  fap.application_id
148       AND fou.oracle_id            =  fpi.oracle_id
149       AND fpi.install_group_num    IN (0, 1) --MSOB no more supported
150       AND UPPER(adp.product_abbreviation)
151                             =  UPPER(SUBSTR( fap.basepath
152                                             ,1
153                                             ,INSTR(fap.basepath,'_TOP') - 1
154                                            )
155                                     )
156       AND fou_apps.install_group_num = 1 -- fpi.install_group_num (5330846)
157       AND fou_apps.read_only_flag    = 'U'
158       ;
159 
160    --Application ID cannot be longer that 5 chars
161    IF LENGTH(TO_CHAR(p_application_info.application_id)) > 5
162    THEN
163       IF (C_LEVEL_EXCEPTION >= g_log_level)
164       THEN
165          trace
166          (p_msg      => 'Application_id is too long, aborting'
167          ,p_level    => C_LEVEL_PROCEDURE);
168       END IF;
169       RAISE le_fatal_error;
170    END IF;
171 
172    --Application ID cannot be negative
173    IF SIGN(p_application_info.application_id) <= 0
174    THEN
175       IF (C_LEVEL_EXCEPTION >= g_log_level) THEN
176          trace
177          (p_msg      => 'Application_id is negative, aborting'
181    END IF;
178          ,p_level    => C_LEVEL_PROCEDURE);
179       END IF;
180       RAISE le_fatal_error;
182 
183    --Build the hash id
184    p_application_info.application_hash_id := LPAD
185                       ( TO_CHAR(p_application_info.application_id)
186                        ,5
187                        ,'0'
188                       );
189    IF (C_LEVEL_STATEMENT >= g_log_level) THEN
190       trace
191          (p_msg      => 'Application hash id: '
192                         || p_application_info.application_hash_id
193          ,p_level    => C_LEVEL_STATEMENT);
194    END IF;
195 
196    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
197       trace
198          (p_msg      => 'END ' || l_log_module
199          ,p_level    => C_LEVEL_PROCEDURE);
200    END IF;
201 
202    RETURN TRUE;
203 
204 EXCEPTION
205 WHEN le_fatal_error
206 THEN
207    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
208       trace
209          (p_msg   => 'END with fatal error' || l_log_module
210          ,p_level => C_LEVEL_PROCEDURE);
211    END IF;
212    RETURN FALSE;
213 
214 WHEN xla_exceptions_pkg.application_exception THEN
215    RAISE;
216 WHEN OTHERS                                   THEN
217    xla_exceptions_pkg.raise_message
218       (p_location => 'xla_cmp_common_pkg.get_application_info');
219 
220 END get_application_info;
221 
222 
223 FUNCTION get_user_name
224                   ( p_user_id          IN            NUMBER
225                    ,p_user_name        OUT NOCOPY    VARCHAR2
226                   )
227 RETURN BOOLEAN
228 IS
229 l_log_module                 VARCHAR2 (2000);
230 BEGIN
231    IF g_log_enabled THEN
232       l_log_module := C_DEFAULT_MODULE||'.get_user_name';
233    END IF;
234 
235    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
236       trace
237          (p_msg      => 'BEGIN ' || C_DEFAULT_MODULE||'.get_user_name'
238          ,p_level    => C_LEVEL_PROCEDURE);
239    END IF;
240 
241    IF (C_LEVEL_STATEMENT >= g_log_level) THEN
242       trace
243          (p_msg      => 'Looking for user id: ' || p_user_id
244          ,p_level    => C_LEVEL_STATEMENT);
245    END IF;
246 
247    BEGIN
248       SELECT user_name
249         INTO p_user_name
250         FROM fnd_user
251        WHERE user_id = p_user_id;
252    EXCEPTION
253    WHEN NO_DATA_FOUND
254    THEN
255       p_user_name := 'Unknown user';
256    END;
257 
258    IF (C_LEVEL_STATEMENT >= g_log_level) THEN
259       trace
260          (p_msg      => 'User name retrieved: ' || p_user_name
261          ,p_level    => C_LEVEL_STATEMENT);
262    END IF;
263 
264    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
265       trace
266          (p_msg      => 'END ' || C_DEFAULT_MODULE||'.get_user_name'
267          ,p_level    => C_LEVEL_PROCEDURE);
268    END IF;
269 
270    RETURN TRUE;
271 
272 EXCEPTION
273 WHEN xla_exceptions_pkg.application_exception THEN
274    RAISE;
275 WHEN OTHERS                                   THEN
276    xla_exceptions_pkg.raise_message
277       (p_location => 'xla_cmp_common_pkg.get_user_name');
278 
279 END get_user_name;
280 
281 
282 --+==========================================================================+
283 --| PRIVATE procedures and functions                                         |
284 --|    CreateString                                                          |
285 --|    transforms long lines (length > 255) into a list of lines not         |
286 --|    exceeding 255 characters                                              |
287 --|                                                                          |
288 --|                                                                          |
289 --+==========================================================================+
290 PROCEDURE CreateString( p_package_text  IN  VARCHAR2
291                        ,p_array_string  OUT NOCOPY DBMS_SQL.VARCHAR2S)
292 IS
293 --
294 l_Text                VARCHAR2(32000);
295 l_SubText             VARCHAR2(256);
296 --
297 l_MaxLine             NUMBER   := G_MAX_PACKAGE_LINE_LENGTH;
298 --
299 l_NewLine             BOOLEAN;
300 l_Literal             BOOLEAN;
301 l_Space               BOOLEAN;
302 --
303 l_pos                 NUMBER         ;
304 --
305 l_Idx                 BINARY_INTEGER;
306 l_array_string        DBMS_SQL.VARCHAR2S;
307 --
308 l_log_module                 VARCHAR2 (2000);
309 BEGIN
310 --
311 xla_utility_pkg.trace('> xla_cmp_string_pkg.CreateString' , 80);
312 --
313 --
314     l_Text      := p_package_text;
315     l_pos       := 0;
316     l_NewLine   := FALSE;
317     l_Literal   := FALSE;
318     l_Space     := FALSE;
319     l_Idx       := 0;
320     --
321     WHILE ( LENGTH(l_Text) >= l_MaxLine ) LOOP
322     --
323       BEGIN
324          --
325          l_SubText   := SUBSTR(l_Text,1,l_MaxLine);
326          l_pos       := INSTR(l_SubText,g_chr_newline,1,1);
327          --
328          IF l_pos = 0 THEN
329          --
330            l_NewLine := FALSE;
331            l_pos := INSTR(l_SubText,g_chr_quote,1,1);
332            --
333            IF l_pos = 0 THEN
334            --
335              l_Literal := FALSE;
339            ELSE
336              l_pos     := INSTR(l_SubText,g_chr_space,1,1);
337              l_Space   := (l_pos = 0);
338            --
340            --
341              l_Literal := TRUE;
342            --
343            END IF;
344          --
345          ELSE
346          --
347            l_NewLine := TRUE;
348          --
349          END IF;
350          --
351          --
352          IF l_newline THEN
353          --
354            l_Idx                  := l_Idx + 1;
355            l_array_string(l_Idx)  := SUBSTR(l_SubText,1,l_pos);
356            l_Text                 := SUBSTR(l_Text,l_pos + 1);
357          --
358          ELSIF l_Literal THEN
359          --
360            l_Idx                  := l_Idx + 1;
361            l_array_string(l_Idx)  := SUBSTR(l_SubText,1,l_pos-1) || g_chr_newline;
362            l_Text                 := SUBSTR(l_Text,l_pos);
363          --
364          ELSIF l_Space   THEN
365          --
366            l_Idx                  := l_Idx + 1;
367            l_array_string(l_Idx)  := SUBSTR(l_SubText,1,l_pos-1) || g_chr_newline;
368            l_Text                 := SUBSTR(l_Text,l_pos + 1);
369          --
370          ELSE
371          --
372            l_Idx                  := l_Idx + 1;
373            l_array_string(l_Idx)  := l_SubText;
374            l_Text                 := SUBSTR(l_Text,l_MaxLine + 1);
375          --
376          END IF;
377          --
378       END;
379      -- xla_utility_pkg.trace('Text('||l_Idx||') = '||l_array_string(l_Idx), 100);
380     END LOOP;
381 --
382 IF LENGTH(l_Text) > 0 THEN
383 --
384   l_Idx                 := l_Idx + 1;
385   l_array_string(l_Idx) := l_Text;
386  -- xla_utility_pkg.trace('Text('||l_Idx||') = '||l_array_string(l_Idx), 100);
387 --
388 END IF;
389 --
390 p_array_string := l_array_string;
391 --
392 xla_utility_pkg.trace('< xla_cmp_string_pkg.CreateString' , 80);
393 --
394 EXCEPTION
395    WHEN xla_exceptions_pkg.application_exception   THEN
396        RAISE;
397    WHEN OTHERS    THEN
398       xla_exceptions_pkg.raise_message
399          (p_location => 'xla_cmp_string_pkg.CreateString');
400 END CreateString;
401 
402 
403 
404 PROCEDURE clob_to_varchar2s
405                     (
406                       p_clob          IN  CLOB
407                      ,p_varchar2s     OUT NOCOPY DBMS_SQL.VARCHAR2S
408                     )
409 IS
410    l_current_table_index PLS_INTEGER;
411    l_current_pos_in_clob PLS_INTEGER;
412    l_next_newline_pos    PLS_INTEGER;
413    l_clob_length         PLS_INTEGER;
414    l_subarray            DBMS_SQL.VARCHAR2S;
415 l_log_module                 VARCHAR2 (2000);
416 
417 BEGIN
418    IF g_log_enabled THEN
419       l_log_module := C_DEFAULT_MODULE||'.clob_to_varchar2s';
420    END IF;
421 
422    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
423       trace
424          (p_msg      => 'BEGIN ' || l_log_module
425          ,p_level    => C_LEVEL_PROCEDURE);
426    END IF;
427 
428    l_clob_length         := LENGTH(p_clob);
429    l_current_table_index := -1;
430    l_current_pos_in_clob := 1;
431 
432    WHILE l_current_pos_in_clob < l_clob_length
433    LOOP
434       l_current_table_index := l_current_table_index + 1;
435       l_next_newline_pos    := INSTR
436         ( p_clob                --clob to search
437          ,g_chr_newline         --character to look for
438          ,l_current_pos_in_clob --starting position
439          ,1                     --occurrence
440         );
441 
442       IF l_next_newline_pos = 0
443       THEN
444          --no new line found, take all the string to the end
445          --if the length of the substring exceeds the maximum
446          --break it into substrings
447          IF (l_clob_length - l_current_pos_in_clob + 1 )
448             <= G_MAX_PACKAGE_LINE_LENGTH
449          THEN
450             --the chunk length is within the maximum
451             p_varchar2s(l_current_table_index) := SUBSTR
452                                                   ( p_clob
453                                                    ,l_current_pos_in_clob
454                                                   );
455          ELSE
456             /*xla_cmp_string_pkg.*/CreateString
457                    (
458                      p_package_text => SUBSTR
459                                           ( p_clob
460                                            ,l_current_pos_in_clob
461                                           )
462                     ,p_array_string => l_subarray
463                    );
464             FOR i IN l_subarray.FIRST..l_subarray.LAST
465             LOOP
466                IF i > l_subarray.FIRST
467                THEN
468                   l_current_table_index := l_current_table_index + 1;
469                END IF;
470                p_varchar2s(l_current_table_index) := l_subarray(i);
471             END LOOP;
472          END IF;
473 
474          l_current_pos_in_clob              := l_clob_length;
475 
476       ELSIF l_next_newline_pos IS NULL
477       THEN
478          --probably offset > LOBMAXSIZE
479          NULL;
480          --raise exception
481       ELSE
482          IF (l_next_newline_pos - l_current_pos_in_clob + 1 )
483             <= G_MAX_PACKAGE_LINE_LENGTH
484          THEN
485             --take the portion
486             p_varchar2s(l_current_table_index) := SUBSTR
487                                                   ( p_clob
491                                                     + 1
488                                                    ,l_current_pos_in_clob
489                                                    ,l_next_newline_pos
490                                                     - l_current_pos_in_clob
492                                                   );
493          ELSE
494             /*xla_cmp_string_pkg.*/CreateString
495                    (
496                      p_package_text => SUBSTR
497                                                   ( p_clob
498                                                    ,l_current_pos_in_clob
499                                                    ,l_next_newline_pos
500                                                     - l_current_pos_in_clob
501                                                     + 1
502                                                   )
503                     ,p_array_string => l_subarray
504                    );
505             FOR i IN l_subarray.FIRST..l_subarray.LAST
506             LOOP
507                IF i > l_subarray.FIRST
508                THEN
509                   l_current_table_index := l_current_table_index + 1;
510                END IF;
511                p_varchar2s(l_current_table_index) := l_subarray(i);
512             END LOOP;
513          END IF;
514 
515          l_current_pos_in_clob              := l_next_newline_pos + 1;
516 
517       END IF;
518    END LOOP;
519 
520    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
521       trace
522          (p_msg      => 'END ' || l_log_module
523          ,p_level    => C_LEVEL_PROCEDURE);
524    END IF;
525 
526 EXCEPTION
527    WHEN xla_exceptions_pkg.application_exception   THEN
528        RAISE;
529    WHEN OTHERS    THEN
530       xla_exceptions_pkg.raise_message
531          (p_location => 'xla_cmp_common_pkg.clob_to_varchar2s');
532 END clob_to_varchar2s;
533 
534 
535 
536 PROCEDURE varchar2s_to_clob
537                     (
538                       p_varchar2s     IN         DBMS_SQL.VARCHAR2S
539                      ,x_clob          OUT NOCOPY CLOB
540                     )
541 IS
542 l_log_module                 VARCHAR2 (2000);
543 BEGIN
544    IF g_log_enabled THEN
545       l_log_module := C_DEFAULT_MODULE||'.varchar2s_to_clob';
546    END IF;
547 
548    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
549       trace
550          (p_msg      => 'BEGIN ' || l_log_module
551          ,p_level    => C_LEVEL_PROCEDURE);
552    END IF;
553 
554    x_clob := NULL;
555 
556    IF p_varchar2s.FIRST IS NULL
557    THEN
558       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
559          trace
560          (p_msg      => 'p_varchar2s is empty'
561          ,p_level    => C_LEVEL_STATEMENT);
562       END IF;
563    ELSE
564       FOR i IN p_varchar2s.FIRST..p_varchar2s.LAST
565       LOOP
566           x_clob := x_clob || p_varchar2s(i);
567       END LOOP;
568    END IF;
569 
570    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
571       trace
572          (p_msg      => 'END ' || l_log_module
573          ,p_level    => C_LEVEL_PROCEDURE);
574    END IF;
575 
576 EXCEPTION
577    WHEN xla_exceptions_pkg.application_exception   THEN
578        RAISE;
579    WHEN OTHERS    THEN
580       xla_exceptions_pkg.raise_message
581          (p_location => 'xla_cmp_common_pkg.varchar2s_to_clob');
582 END varchar2s_to_clob;
583 
584 
585 
586 PROCEDURE dump_text
587                     (
588                       p_text          IN  VARCHAR2
589                     )
590 IS
591    l_cur_position      INTEGER;
592    l_next_cr_position  INTEGER;
593    l_text_length       INTEGER;
594 l_log_module                 VARCHAR2 (2000);
595 
596 BEGIN
597    IF g_log_enabled THEN
598       l_log_module := C_DEFAULT_MODULE||'.dump_text';
599    END IF;
600 /*
601    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
602       trace
603          (p_msg      => 'BEGIN ' || l_log_module
604          ,p_level    => C_LEVEL_PROCEDURE);
605    END IF;
606 */
607    --Dump the SQL command
608    IF (C_LEVEL_STATEMENT >= g_log_level) THEN
609       l_cur_position      := 1;
610       l_next_cr_position  := 0;
611       l_text_length       := LENGTH(p_text);
612 
613       WHILE l_next_cr_position < l_text_length
614       LOOP
615          l_next_cr_position := INSTR( p_text
616                                      ,g_chr_newline
617                                      ,l_cur_position
618                                     );
619 
620          IF l_next_cr_position = 0
621          THEN
622             l_next_cr_position := l_text_length;
623          END IF;
624 
625          trace
626             (p_msg      => SUBSTR( p_text
627                                   ,l_cur_position
628                                   ,l_next_cr_position
629                                    - l_cur_position
630                                    + 1
631                                  )
632             ,p_level    => C_LEVEL_STATEMENT);
633 
634          IF l_cur_position < l_text_length
635          THEN
636             l_cur_position := l_next_cr_position + 1;
637          END IF;
638       END LOOP;
639    END IF;
640 /*
641    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
642       trace
643          (p_msg      => 'END ' || l_log_module
644          ,p_level    => C_LEVEL_PROCEDURE);
648    WHEN xla_exceptions_pkg.application_exception   THEN
645    END IF;
646 */
647 EXCEPTION
649        RAISE;
650    WHEN OTHERS    THEN
651       xla_exceptions_pkg.raise_message
652          (p_location => 'xla_cmp_common_pkg.dump_text');
653 END dump_text;
654 
655 PROCEDURE dump_text
656                     (
657                       p_text          IN  DBMS_SQL.VARCHAR2S
658                     )
659 IS
660 l_log_module                 VARCHAR2 (2000);
661 
662 BEGIN
663    IF g_log_enabled THEN
664       l_log_module := C_DEFAULT_MODULE||'.dump_text';
665    END IF;
666 
667    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
668       trace
669          (p_msg      => 'BEGIN ' || l_log_module
670          ,p_level    => C_LEVEL_PROCEDURE);
671    END IF;
672 
673    IF p_text.FIRST IS NULL
674    THEN
675       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
676          trace
677          (p_msg      => 'p_text is empty'
678          ,p_level    => C_LEVEL_STATEMENT);
679       END IF;
680    ELSE
681       FOR i IN p_text.FIRST..p_text.LAST
682       LOOP
683          dump_text(p_text => p_text(i));
684       END LOOP;
685    END IF;
686 
687    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
688       trace
689          (p_msg      => 'END ' || l_log_module
690          ,p_level    => C_LEVEL_PROCEDURE);
691    END IF;
692 
693 EXCEPTION
694    WHEN xla_exceptions_pkg.application_exception   THEN
695        RAISE;
696    WHEN OTHERS    THEN
697       xla_exceptions_pkg.raise_message
698          (p_location => 'xla_cmp_common_pkg.dump_text');
699 END dump_text;
700 
701 PROCEDURE dump_text
702                     (
703                       p_text          IN  CLOB
704                     )
705 IS
706    l_cur_position      INTEGER;
707    l_next_cr_position  INTEGER;
708    l_text_length       INTEGER;
709 
710    l_log_module                 VARCHAR2 (2000);
711 
712 BEGIN
713    IF g_log_enabled THEN
714       l_log_module := C_DEFAULT_MODULE||'.dump_text';
715    END IF;
716 
717    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
718       trace
719          (p_msg      => 'BEGIN ' || l_log_module
720          ,p_level    => C_LEVEL_PROCEDURE);
721    END IF;
722 
723    IF (C_LEVEL_STATEMENT >= g_log_level) THEN
724       l_cur_position      := 1;
725       l_next_cr_position  := 0;
726       l_text_length       := LENGTH(p_text);
727 
728       WHILE l_next_cr_position < l_text_length
729       LOOP
730          l_next_cr_position := INSTR( p_text
731                                      ,g_chr_newline
732                                      ,l_cur_position
733                                     );
734 
735          IF l_next_cr_position = 0
736          THEN
737             l_next_cr_position := l_text_length;
738          END IF;
739 
740          trace
741             (p_msg      => SUBSTR( p_text
742                                   ,l_cur_position
743                                   ,l_next_cr_position
744                                    - l_cur_position
745                                    + 1
746                                  )
747             ,p_level    => C_LEVEL_STATEMENT);
748 
749          IF l_cur_position < l_text_length
750          THEN
751             l_cur_position := l_next_cr_position + 1;
752          END IF;
753       END LOOP;
754    END IF;
755 
756    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
757       trace
758          (p_msg      => 'END ' || l_log_module
759          ,p_level    => C_LEVEL_PROCEDURE);
760    END IF;
761 
762 EXCEPTION
763    WHEN xla_exceptions_pkg.application_exception   THEN
764        RAISE;
765    WHEN OTHERS    THEN
766       xla_exceptions_pkg.raise_message
767          (p_location => 'xla_cmp_common_pkg.dump_text');
768 END dump_text;
769 
770 
771 FUNCTION bool_to_char(p_boolean IN BOOLEAN)
772 RETURN VARCHAR2
773 IS
774    l_log_module                 VARCHAR2 (2000);
775    l_return_value               VARCHAR2 (10);
776 BEGIN
777    IF g_log_enabled THEN
778       l_log_module := C_DEFAULT_MODULE||'.bool_to_char';
779    END IF;
780 
781    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
782       trace
783          (p_msg      => 'BEGIN+END' || l_log_module
784          ,p_level    => C_LEVEL_PROCEDURE);
785    END IF;
786 
787    l_return_value := CASE p_boolean
788                         WHEN TRUE THEN 'TRUE'
789                         WHEN FALSE THEN 'FALSE'
790                         ELSE 'NULL'
791                      END;
792 
793    RETURN l_return_value;
794 EXCEPTION
795    WHEN xla_exceptions_pkg.application_exception   THEN
796        RAISE;
797    WHEN OTHERS THEN
798       xla_exceptions_pkg.raise_message
799          (p_location => 'xla_cmp_common_pkg.bool_to_char');
800 END bool_to_char;
801 
802 
803 FUNCTION replace_token
804                     (
805                       p_original_text    IN  CLOB
806                      ,p_token            IN  VARCHAR2
807                      ,p_replacement_text IN  CLOB
808                     )
809 RETURN CLOB
810 IS
811    l_found_position    INTEGER;
812 
813    l_return_value      CLOB;
814 
815    l_log_module        VARCHAR2 (2000);
816 
817 BEGIN
818    IF g_log_enabled THEN
819       l_log_module := C_DEFAULT_MODULE||'.dump_text';
820    END IF;
821 
822    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
823       trace
824          (p_msg      => 'BEGIN ' || l_log_module
825          ,p_level    => C_LEVEL_PROCEDURE);
826    END IF;
827 
828    --Copy the original clob into a local variable
829    l_return_value   := p_original_text;
830 
831    --Start a loop since the token might appear multiple times
832    LOOP
833       --Find the first occurrence of the token
834       l_found_position := INSTR(l_return_value, p_token);
835 
836       --If not found exit
837       IF    l_found_position = 0
838          OR l_found_position IS NULL
839       THEN
840          EXIT;
841       END IF;
842 
843       --Extract the portions around the token and embed the replacement
844       l_return_value := SUBSTR( l_return_value
845                                ,1
846                                ,l_found_position - 1
847                               )
848                      || p_replacement_text
849                      || SUBSTR( l_return_value
850                                ,l_found_position + LENGTH(p_token)
851                               );
852    END LOOP;
853 
854    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
855       trace
856          (p_msg      => 'END ' || l_log_module
857          ,p_level    => C_LEVEL_PROCEDURE);
858    END IF;
859 
860    RETURN l_return_value;
861 EXCEPTION
862    WHEN xla_exceptions_pkg.application_exception   THEN
863        RAISE;
864    WHEN OTHERS    THEN
865       xla_exceptions_pkg.raise_message
866          (p_location => 'xla_cmp_common_pkg.replace_token');
867 END replace_token;
868 
869 
870 --Trace initialization
871 BEGIN
872    g_log_level      := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
873    g_log_enabled    := fnd_log.test
874                           (log_level  => g_log_level
875                           ,module     => C_DEFAULT_MODULE);
876 
877    IF NOT g_log_enabled  THEN
878       g_log_level := C_LEVEL_LOG_DISABLED;
879    END IF;
880 
881 END xla_cmp_common_pkg;