[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;