DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_DEBUG

Source


1 PACKAGE BODY PN_DEBUG AS
2 /* $Header: PNDEBUKB.pls 120.2 2011/01/28 10:25:33 kmaddi noship $ */
3    -- Initialize PROCEDURE
4 
5    PROCEDURE initialize IS
6    BEGIN
7       NULL;
8 
9    EXCEPTION
10     WHEN  OTHERS  THEN
11       RAISE;
12    END initialize;
13 
14    PROCEDURE enable_debug IS
15    BEGIN
16      debug_flag := TRUE;
17      debug_level:= DEBUG_LEVEL_BASIC;
18    END enable_debug;
19 
20    PROCEDURE enable_debug (x_debug_level IN NUMBER) IS
21    BEGIN
22      debug_flag := TRUE;
23      debug_level := x_debug_level;
24    END enable_debug;
25 
26    PROCEDURE disable_debug IS
27    BEGIN
28      debug_flag := FALSE;
29    END disable_debug;
30 
31    PROCEDURE set_debug_level (x_debug_level IN NUMBER) IS
32    BEGIN
33      debug_level := x_debug_level;
34    END set_debug_level;
35 
36    PROCEDURE DEBUG (x_debug_message IN VARCHAR2) IS
37     rest VARCHAR2(32767);
38    BEGIN
39        IF (debug_flag AND x_debug_message IS NOT NULL) THEN
40      IF ( debug_level = DEBUG_LEVEL_TIMING) THEN
41         rest := TO_CHAR(SYSDATE, 'DD-MON-YYYY HH:MI:SS ') || x_debug_message;
42      ELSE
43         rest := x_debug_message;
44      END IF;
45      LOOP
46        IF (rest IS NULL) THEN
47           EXIT;
48        ELSE
49               number_of_debug_messages := number_of_debug_messages + 1;
50               debug_message(number_of_debug_messages) := SUBSTRB(rest,1,255);
51           rest := SUBSTRB(rest, 256);
52        END IF; -- IF (rest IS NULL)
53      END LOOP;
54        END IF; -- IF (debug_flag)
55    END DEBUG;
56 
57    PROCEDURE DEBUG (x_debug_message IN VARCHAR2, x_debug_level IN NUMBER) IS
58     old_debug_flag BOOLEAN;
59    BEGIN
60       IF ( debug_level >= x_debug_level ) THEN
61          IF ( x_debug_level = DEBUG_LEVEL_EXCEPTION ) THEN
62            old_debug_flag := debug_flag;
63            debug_flag     := TRUE;
64            DEBUG(x_debug_message);
65            debug_flag     := old_debug_flag;
66          ELSE
67            DEBUG(x_debug_message);
68          END IF;
69       END IF;
70    END DEBUG;
71 
72    PROCEDURE get_message(x_message_number IN NUMBER,
73              x_debug_message OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
74    BEGIN
75       IF (x_message_number > 0 ) THEN
76     x_debug_message := debug_message(x_message_number);
77       END IF;
78    END get_message;
79 
80    FUNCTION no_of_debug_messages RETURN NUMBER IS
81    BEGIN
82      RETURN number_of_debug_messages;
83    END no_of_debug_messages;
84 --------------------------------------------------------------------
85 /* APIs for handling processes, errors, named locks */
86 --------------------------------------------------------------------
87 
88 PROCEDURE Set_User_Lock_Mode (  x_Lock_Mode     IN      NUMBER  DEFAULT 6,
89                                 x_Commit_Mode   IN      BOOLEAN DEFAULT FALSE,
90                                 x_TimeOut       IN      NUMBER  DEFAULT 0 )
91 IS
92 BEGIN
93 
94     G_LockMode := NVL(x_Lock_Mode,6);
95     G_CommitMode := NVL(x_Commit_Mode,FALSE);
96     G_TimeOut := NVL(x_TimeOut,0);
97 
98 END Set_User_Lock_Mode;
99 
100 
101 ----------------------------------------------------------------
102 /** Acquire_User_Lock : Function to acquire a user lock.
103         x_lock_name : name of the lock.
104         x_lock_mode : Mode of the lock ( Exclusive,..)
105         x_commit_mode : Rls with commit or not
106         Returns : 0 if successful in acquiring lock
107             : < 0 ( -1 to -5) if error in requesting lock (error status)
108         : -99 if unable to allocate unique handle for the lock
109         Ora Errors are not handled
110 **/
111 
112 
113 FUNCTION        Acquire_User_Lock ( x_Lock_Name     IN      VARCHAR2,
114                                     x_Lock_Mode     IN      NUMBER ,
115                                     x_Commit_Mode   IN      BOOLEAN,
116                     x_TimeOut         IN        NUMBER )
117 RETURN  NUMBER
118 IS
119         lstatus  NUMBER;
120         lockhndl VARCHAR2(128);
121         lTimeOut NUMBER;
122 
123 BEGIN
124 
125     /* If Lock Name is NULL then return -99 */
126 
127     IF (x_Lock_Name IS NULL ) THEN
128         RETURN -99;
129     END IF;
130 
131 
132          IF x_TimeOut = 0 THEN
133                 lTimeOut := 864000;
134          ELSE
135                 lTimeOut := x_TimeOut;
136          END IF;
137 
138 
139 
140         /* get lock handle for user lock */
141 
142         -- dbms_lock.allocate_unique(x_lock_name,lockhndl,G_TimeOut);
143 
144         dbms_lock.allocate_unique(x_lock_name,lockhndl,lTimeOut);
145 
146         IF ( lockhndl IS NOT NULL ) THEN
147           /* Get the lock, do not release the lock on commit */
148 
149           lstatus := dbms_lock.request(lockhndl,
150                 NVL(x_lock_mode,G_LockMode),
151                 G_TimeOut,
152                 NVL(x_commit_mode,G_CommitMode));
153 
154           IF ( lstatus = 0 ) THEN /* Got the lock */
155                 RETURN 0;
156           ELSE
157                 RETURN (-1*lstatus);/* Return the status obtained on request */
158           END IF;
159         ELSE
160           RETURN -99;  /* Failed to allocate lock */
161         END IF;
162 
163 END Acquire_User_Lock;
164 
165 FUNCTION        Acquire_User_Lock ( x_Lock_Name     IN      VARCHAR2)
166 RETURN  NUMBER
167 IS
168 BEGIN
169 
170     RETURN Acquire_User_Lock( x_Lock_Name,G_LockMode,G_CommitMode,G_TimeOut
171 );
172 
173 END Acquire_User_Lock;
174 
175 
176 ------------------------------------------------------------------
177 /** Release_User_Lock : Function to release user lock.
178         x_Lock_Name : The lock name to release
179         Returns :0 - success,
180         :< 0 - Error.
181         Ora Errors are not handled
182 **/
183 
184 
185 FUNCTION        Release_User_Lock ( x_Lock_Name     IN      VARCHAR2 )
186                 RETURN NUMBER
187 IS
188 lstatus NUMBER;
189 lockhndl VARCHAR2(128);
190 lTimeOut NUMBER;
191 
192 BEGIN
193 
194         /* If Lock Name is NULL then return -99 */
195 
196         IF (x_Lock_Name IS NULL ) THEN
197                 RETURN -99;
198         END IF;
199 
200 
201          IF G_TimeOut = 0 THEN
202                 lTimeOut := 864000;
203          ELSE
204                 lTimeOut := G_TimeOut;
205          END IF;
206 
207 
208         /* get lock handle for user lock */
209 
210         -- dbms_lock.allocate_unique(x_lock_name,lockhndl,G_TimeOut);
211 
212         dbms_lock.allocate_unique(x_lock_name,lockhndl,lTimeOut);
213 
214         IF ( lockhndl IS NOT NULL ) THEN
215           /* Release the Lock */
216 
217           lstatus := dbms_lock.RELEASE(lockhndl);
218 
219           IF ( lstatus = 0 ) THEN /* Lock Released */
220                 RETURN 0;
221           ELSE
222                 RETURN (-1*lstatus);/* Return the status obtained on release */
223           END IF;
224         ELSE
225           RETURN -99;  /* Failed to allocate lock */
226         END IF;
227 
228 END Release_User_Lock;
229 
230 ------------------------------------------------------------------
231 PROCEDURE Set_Process ( x_Process       IN      VARCHAR2, -- 1851096
232                         x_Write_File    IN      VARCHAR2 DEFAULT 'LOG',
233                         x_Debug_Mode    IN    VARCHAR2 DEFAULT 'N' )
234 IS
235 
236 BEGIN
237     SELECT DECODE(x_Process,'PLSQL','PLSQL','SQL','SQL','REPORT',
238                 'REPORT','FORM','FORM','PLSQL'),
239         DECODE(x_Write_File,'LOG','LOG','OUT','OUT','LOG')
240     INTO G_Process, G_WriteFile
241     FROM dual;
242 
243     IF (x_Debug_Mode = 'Y') THEN
244        Enable_Debug;
245     ELSE
246        Disable_Debug;
247     END IF;
248 
249     IF (G_Process = 'PLSQL') THEN
250        SELECT DECODE(G_WriteFile,'LOG',Fnd_File.LOG,Fnd_File.OUTPUT )
251        INTO   G_WriteFileID
252        FROM dual;
253         ELSIF (G_Process = 'REPORT') THEN
254            Enable_Debug;  /* If REPORT is used, then need to enable debug */
255     ELSIF (G_Process = 'FORM') THEN
256        Enable_Debug;
257        number_of_debug_messages := 0;
258     END IF;
259 
260 END Set_Process;
261 ---------------------------------------------------------------------
262 PROCEDURE Write_File (  x_Write_File    IN      VARCHAR2,
263             x_Msg        IN    VARCHAR2,
264             x_Write_Mode    IN    NUMBER     DEFAULT 0)
265 IS
266     rest VARCHAR2(32767);
267     rest1 VARCHAR2(32767);
268     l_log_level NUMBER :=6;
269 
270 BEGIN
271    /* Write only if mandatory : Write_Mode = 1
272       OR Optional for Debug : Write_Mode = 0 and Debug flag */
273 
274    rest := x_msg;
275 
276    IF (x_Write_Mode <> 0 OR (x_Write_Mode = 0 AND Debug_Flag )) THEN
277       LOOP
278         IF (rest IS NULL) THEN
279               EXIT;
280         ELSE
281               rest1 := SUBSTRB(rest,1,255);
282               rest := SUBSTRB(rest, 256);
283         END IF; -- IF (rest IS NULL)
284 
285     IF G_Process = 'PLSQL' THEN
286        IF NVL(x_Write_File,G_WriteFile) = 'OUT' THEN
287         Fnd_File.PUT(Fnd_File.OUTPUT,rest1);
288         Fnd_File.NEW_LINE(Fnd_File.OUTPUT);
289        ELSIF NVL(x_Write_File,G_WriteFile) = 'LOG' THEN
290         Fnd_File.PUT(Fnd_File.LOG,rest1);
291         Fnd_File.NEW_LINE(Fnd_File.LOG);
292         IF (l_log_level >= Fnd_Log.G_CURRENT_RUNTIME_LEVEL) THEN -- by GSCC standard we have to checkt the level
293             Fnd_Log.STRING(l_log_level,'Concurrent Request ID:'|| x_request_id,x_Msg);
294         END IF;
295        ELSE
296         Fnd_File.PUT(G_WriteFileID,rest1);
297         Fnd_File.NEW_LINE(G_WriteFileID);
298        END IF;
299     ELSIF G_Process = 'SQL' THEN
300        /* DBMS_OUTPUT.PUT_LINE(rest1); */
301      NULL;
302    ELSIF G_Process = 'IGNORE' THEN
303      NULL;
304     ELSE            /* This applies to REPORT and FORM */
305        DEBUG(rest1);
306     END IF;
307       END LOOP;
308    END IF;
309 
310 EXCEPTION
311 
312    WHEN UTL_FILE.INVALID_PATH THEN
313     RAISE_APPLICATION_ERROR(-20010,'INVALID PATH exception from UTL_FILE !!'
314                 || G_Err_Stack ||' - '||G_Err_Stage);
315 
316    WHEN UTL_FILE.INVALID_MODE THEN
317         RAISE_APPLICATION_ERROR(-20010,'INVALID MODE exception from UTL_FILE !!'
318                                 || G_Err_Stack ||' - '||G_Err_Stage);
319 
320    WHEN UTL_FILE.INVALID_FILEHANDLE THEN
321         RAISE_APPLICATION_ERROR(-20010,'INVALID FILEHANDLE exception from UTL_FILE !!'
322                                 || G_Err_Stack ||' - '||G_Err_Stage);
323 
324    WHEN UTL_FILE.INVALID_OPERATION THEN
325         RAISE_APPLICATION_ERROR(-20010,'INVALID OPERATION exception from UTL_FILE !!'
326                                 || G_Err_Stack ||' - '||G_Err_Stage);
327 
328    WHEN UTL_FILE.READ_ERROR THEN
329         RAISE_APPLICATION_ERROR(-20010,'READ ERROR exception from UTL_FILE !!'
330                                 || G_Err_Stack ||' - '||G_Err_Stage);
331 
332    WHEN UTL_FILE.WRITE_ERROR THEN
333         RAISE_APPLICATION_ERROR(-20010,'WRITE ERROR exception from UTL_FILE !!'
334                                 || G_Err_Stack ||' - '||G_Err_Stage);
335 
336    WHEN UTL_FILE.INTERNAL_ERROR THEN
337         RAISE_APPLICATION_ERROR(-20010,'INTERNAL ERROR exception from UTL_FILE !!'
338                                 || G_Err_Stack ||' - '||G_Err_Stage);
339 
340 END Write_File;
341 ---------------------------------------------------------------------
342 PROCEDURE Write_File(    x_Msg         IN    VARCHAR2,
343             x_Write_Mode     IN    NUMBER DEFAULT 0 )
344 IS
345 BEGIN
346     Write_File( G_WriteFile, x_Msg, x_Write_Mode ) ;
347 END Write_File;
348 ---------------------------------------------------------------------
349 
350 -- This procedure is deprecated. Please use PN_DEBUG.WRITE.
351 PROCEDURE Write_Log (    x_Module    IN    VARCHAR2,
352             x_Msg        IN    VARCHAR2,
353             x_Log_Level    IN    NUMBER DEFAULT 6 )
354 IS
355   -- OA changed their log level mapping so we have changed this method to use
356   -- the new mapping.
357   l_new_log_level NUMBER;
358 BEGIN
359   IF (x_log_level = 4 OR x_log_level = 6) THEN
360     l_new_log_level := 3;
361   ELSIF (x_log_level = 7) THEN
362     l_new_log_level := 5;
363   ELSE
364     l_new_log_level := 1;
365   END IF;
366 
367 
368   IF (l_new_log_level >= Fnd_Log.G_CURRENT_RUNTIME_LEVEL) THEN
369     Fnd_Log.STRING(l_new_log_level,x_Module,x_Msg);
370   END IF;
371 
372 END Write_Log;
373 ----------------------------------------------------------------------
374 -- x_module: ex. pa.plsql.pa_timeline_pvt
375 -- x_msg: Message
376 -- x_Log_Level: 6 - Unexpected Errors
377 --              5 - Expected Errors
378 --              4 - Exception
379 --              3 - Event (High Level Logging Message)
380 --              2 - Procedure (Entry / Exit from a routine)
381 --              1 - Statement - (Low Level Logging Message)
382 --
383 PROCEDURE WRITE (
384       x_Module    IN    VARCHAR2,
385             x_Msg        IN    VARCHAR2,
386             x_Log_Level    IN    NUMBER DEFAULT 1 )
387 IS
388 
389 BEGIN
390 
391   IF (x_Log_Level >= Fnd_Log.G_CURRENT_RUNTIME_LEVEL) THEN
392     Fnd_Log.STRING(x_log_level,x_Module,x_Msg);
393   END IF;
394 
395 END WRITE;
396 
397 ----------------------------------------------------------------------
398 PROCEDURE Init_Err_Stack (      x_Stack IN      VARCHAR2 )
399 IS
400 BEGIN
401     G_Err_Ind := 1;
402     G_Err_Stack_Tbl(1) := x_Stack;
403     G_Err_Stack := x_Stack;
404 
405 END Init_Err_Stack;
406 -----------------------------------------------------------------
407 PROCEDURE Set_Err_Stack (       x_Stack IN      VARCHAR2 )
408 IS
409 BEGIN
410 
411       If (length(G_Err_Stack || '->' || x_Stack) <= 2000) then
412     G_Err_Stack := G_Err_Stack || '->'||x_Stack;
413       end if;
414 END Set_Err_Stack;
415 -----------------------------------------------------------------
416 PROCEDURE Reset_Err_Stack
417 IS
418 BEGIN
419       G_err_stack := SUBSTR(G_err_stack, 1, INSTR(G_err_stack,'->',-1,1)-1) ;
420 END Reset_Err_Stack;
421 ------------------------------------------------------------------
422 
423 PROCEDURE raise_error(x_Msg_Num    IN NUMBER ,
424               x_Msg        IN VARCHAR2 ,
425               x_TokenName1 IN VARCHAR2 ,
426                       x_Token1     IN VARCHAR2 ,
427                       x_TokenName2 IN VARCHAR2 ,
428                       x_Token2     IN VARCHAR2 ,
432 
429                       x_TokenName3 IN VARCHAR2 ,
430                       x_Token3     IN VARCHAR2 )
431 IS
433 BEGIN
434    Fnd_Message.set_name('PA', x_msg);
435    Fnd_Message.set_token(x_TokenName1, x_Token1);
436    Fnd_Message.set_token(x_TokenName2, x_Token2);
437    Fnd_Message.set_token(x_TokenName3, x_Token3);
438 
439    RAISE_APPLICATION_ERROR(x_Msg_Num,Fnd_Message.get);
440 
441 END raise_error;
442 
443 -------------------------------------------------------------------
444 PROCEDURE raise_error(x_Msg_Num    IN NUMBER ,
445                       x_Msg        IN VARCHAR2 ,
446                       x_TokenName1 IN VARCHAR2 ,
447                       x_Token1     IN VARCHAR2 ,
448                       x_TokenName2 IN VARCHAR2 ,
449                       x_Token2     IN VARCHAR2 )
450 IS
451 
452 BEGIN
453    Fnd_Message.set_name('PA', x_msg);
454    Fnd_Message.set_token(x_TokenName1, x_Token1);
455    Fnd_Message.set_token(x_TokenName2, x_Token2);
456 
457    RAISE_APPLICATION_ERROR(x_Msg_Num,Fnd_Message.get);
458 
459 END raise_error;
460 
461 -------------------------------------------------------------------
462 PROCEDURE raise_error(x_Msg_Num    IN NUMBER ,
463                       x_Msg        IN VARCHAR2 ,
464                       x_TokenName1 IN VARCHAR2 ,
465                       x_Token1     IN VARCHAR2 )
466 IS
467 
468 BEGIN
469    Fnd_Message.set_name('PA', x_msg);
470    Fnd_Message.set_token(x_TokenName1, x_Token1);
471 
472    RAISE_APPLICATION_ERROR(x_Msg_Num,Fnd_Message.get);
473 
474 END raise_error;
475 
476 -------------------------------------------------------------------
477 PROCEDURE raise_error(x_Msg_Num    IN NUMBER ,
478                       x_Msg        IN VARCHAR2 )
479 IS
480 
481 BEGIN
482    Fnd_Message.set_name('PA', x_msg);
483 
484    RAISE_APPLICATION_ERROR(x_Msg_Num,Fnd_Message.get);
485 
486 END raise_error;
487 
488 -------------------------------------------------------------------
489 
490 
491 --Name:               Log_Message
492 --Type:               Procedure
493 --Description:        This procedure writes sysdate date and time, the
494 --                    current procedure name and the passed message
495 --                    to the log file.
496 --
497 --Called subprograms: PN_DEBUG.write_file
498 --
499 
500 PROCEDURE Log_Message( p_message       IN VARCHAR2
501                        , p_write_mode  IN NUMBER   DEFAULT 0
502                        , p_msg_options IN VARCHAR2 DEFAULT 'PLAIN'
503                        , p_write_file  IN VARCHAR2 DEFAULT 'LOG'
504                      )
505 IS
506 
507   l_function    VARCHAR2(50) := NULL;
508 
509 BEGIN
510 
511    IF  (G_Function_Stack.EXISTS(G_Function_Counter))
512      THEN
513         l_function := G_Function_Stack(G_Function_Counter);
514    END IF;
515 
516 
517    IF (p_write_file = 'LOG')
518     THEN
519     -- Print Function Name
520       IF (p_msg_options = 'PLAIN')
521          THEN
522             PN_DEBUG.write_file(p_write_file, g_space ||
523         l_function || ': '  ||p_message, p_write_mode);
524 
525       ELSIF (p_msg_options = 'TIME')
526          THEN
527             PN_DEBUG.write_file(p_write_file,
528         TO_CHAR(SYSDATE,'HH24:MI:SS') || g_space ||
529         l_function || ': '  ||p_message, p_write_mode);
530       ELSE
531         --  Treat as DATETIME, including illegal values.
532             PN_DEBUG.write_file(p_write_file,
533         TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') || g_space ||
534         l_function || ': '  ||p_message, p_write_mode);
535       END IF;
536 
537     ELSE
538     -- Do Not Print Function Name
539       IF (p_msg_options = 'PLAIN')
540          THEN
541             PN_DEBUG.write_file(p_write_file, g_space ||p_message, p_write_mode);
542 
543       ELSIF (p_msg_options = 'TIME')
544          THEN
545             PN_DEBUG.write_file(p_write_file,
546         TO_CHAR(SYSDATE,'HH24:MI:SS') || g_space ||p_message, p_write_mode);
547       ELSE
548         --  Treat as DATETIME, including illegal values.
549             PN_DEBUG.write_file(p_write_file,
550         TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') || g_space ||p_message, p_write_mode);
551       END IF;
552     END IF;
553 
554 EXCEPTION
555 
556 WHEN OTHERS
557  THEN
558    RAISE;
559 
560 END log_message;
561 
562 -------------------------------------------------------------------
563 --Name:               Set_Curr_Function
564 --Type:               Procedure
565 --Description:        This procedure conditionally calls either
566 --                    the init_err_stack and set_process procedures
567 --                    or the set_err_stack procedure. See the aforementioned
568 --                    procedures for more information about their
569 --                    functionality.
570 --
571 --                    With respect to the set_err_stack procedure, this
572 --                    procedure extends the functionality of the
573 --                    set_err_stack procedure by nesting subroutine messages
574 --                    within the overall program flow.
575 --
576 --
577 --Called subprograms: PN_DEBUG.init_err_stack
578 --                    PN_DEBUG.set_process
579 --                    PN_DEBUG.set_err_stack
580 --
581 --
582 
583 PROCEDURE Set_Curr_Function(p_function      IN  VARCHAR2
584                             , p_process        IN    VARCHAR2 DEFAULT 'PLSQL'
585                     , p_write_file  IN    VARCHAR2 DEFAULT 'LOG'
589 BEGIN
586                 , p_debug_mode  IN    VARCHAR2 DEFAULT 'N'
587                             )
588 IS
590 
591    G_Function_Counter := G_Function_Counter + 1;
592    G_Function_Stack(G_Function_Counter) := p_function;
593    G_Space   := G_Space || '  ';
594 
595    IF ( G_Function_Counter = 1)
596       THEN
597           PN_DEBUG.init_err_stack(p_function);
598           PN_DEBUG.set_process (p_process, p_write_file, p_debug_mode);
599    ELSE
600           PN_DEBUG.set_err_stack(p_function);
601    END IF;
602 
603 END Set_Curr_Function;
604 
605 -------------------------------------------------------------------
606 --Name:               Reset_Curr_Function
607 --Type:               Procedure
608 --Description:        This procedure removes the current procedure
609 --                    or function name from the error stack. This
610 --                    procedure also adjusts the global for
611 --                    indentation, accordingly.
612 --
613 --Called subprograms: PN_DEBUG.reset_err_stack
614 --
615 --
616 
617 PROCEDURE Reset_Curr_Function
618 IS
619 BEGIN
620 
621     G_Function_Stack.DELETE(G_Function_Counter);
622     G_Function_Counter := G_Function_Counter -1;
623     G_Space   := SUBSTR(G_Space,1,LENGTH(G_Space)-2);
624     PN_DEBUG.reset_err_stack;
625 
626 END Reset_Curr_Function;
627 
628 -- =======================================================================
629 -- Start of Comments
630 -- API Name      : TrackPath
631 -- Pre-Reqs      : None
632 -- Type          : Procedure
633 -- Function      : This procedure tracks the path thru the code to attach to error messages.
634 --
635 --  Parameters:
636 --
637 --  IN
638 --    P_Function     -  VARCHAR2(10) -- ADD or STRIP
639 --    P_Value        -  VARACHAR2(100)
640 --
641 
642 /*-------------------------------------------------------------------------*/
643 
644 PROCEDURE TrackPath (
645         P_Function IN VARCHAR2,
646         P_Value    IN VARCHAR2)
647 
648 IS
649 
650         l_Value VARCHAR2(2000) := '->' || P_Value;
651 
652 BEGIN
653 
654         PN_DEBUG.G_Stage := 'Entering procedure TrackPath().';
655 
656         IF P_Function = 'ADD' THEN
657 
658                 PN_DEBUG.G_Stage := 'TrackPath(): Adding to PN_DEBUG.G_Path.';
659                 PN_DEBUG.G_Path  := PN_DEBUG.G_Path  || l_Value;
660 
661         ELSIF P_Function = 'STRIP' THEN
662 
663                 PN_DEBUG.G_Stage := 'TrackPath(): Stripping from PN_DEBUG.G_Path.';
664                 PN_DEBUG.G_Path  := SUBSTR(PN_DEBUG.G_Path,1,INSTR(PN_DEBUG.G_Path,l_Value) - 1);
665 
666         END IF;
667 
668         PN_DEBUG.G_Stage := 'Leaving procedure TrackPath().';
669 
670 EXCEPTION
671         WHEN OTHERS THEN
672                 RAISE;
673 
674 END TrackPath;
675 
676 END PN_DEBUG;