1 PACKAGE BODY xla_utility_pkg AS
2 /* $Header: xlacmutl.pkb 120.11 2005/10/22 00:06:21 awan ship $ */
3 /*======================================================================+
4 | Copyright (c) 1995-2002 Oracle Corporation |
5 | Redwood Shores, CA, USA |
6 | All rights reserved. |
7 +=======================================================================+
8 | PACKAGE NAME |
9 | xla_utility_pkg |
10 | |
11 | PACKAGE NAME |
12 | xla_utility_pkg |
13 | |
14 | DESCRIPTION |
15 | XLA Utility Package |
16 | |
17 | This package provides wrapper for debugging/benchmark/testing |
18 | facilities. |
19 | |
20 | A] Trace/Debugging facilities. |
21 | |
22 | The output debug messages are either: |
23 | - printed on the standard OUTPUT, |
24 | - sent to another SRS process waiting for a pipe, |
25 | - written to the current logfile through fnd_file |
26 | - written in an HTML page |
27 | - written in a flat file |
28 | |
29 | Usage from SRS|Forms4.5+: |
30 | Setting up profile options: |
31 | xla_debug_trace_mode (Yes/No) |
32 | xla_debug_trace_level (1..100) |
33 | xla_debug_timeout in seconds (1..n) |
34 | |
35 | Usage from SQL*Plus: |
36 | BEGIN |
37 | xla_utility_pkg.activate('OUTPUT|FILE',location); |
38 | <PL/SQL source>(...); |
39 | xla_utility_pkg.deactivate('OUTPUT|FILE',location); |
40 | END; |
41 | |
42 | PL/SQL coding standard: |
43 | BEGIN |
44 | xla_utility_pkg.activate(mode,location) |
45 | .../... |
46 | xla_utility_pkg.trace('String',trace_level); |
47 | xla_utility_pkg.trace('String',trace_level); |
48 | .../... |
49 | xla_utility_pkg.deactivate(location); |
50 | END; |
51 | |
52 | |
53 | B] SRS Output and logfile facilities |
54 | |
55 | Example of calls: |
56 | BEGIN |
57 | .../... |
58 | xla_utility_pkg.print_outputfile(msg); |
59 | xla_utility_pkg.print_logfile(msg); |
60 | .../... |
61 | END; |
62 | |
63 | |
64 | C] Statistics |
65 | |
66 | Example of calls: |
67 | BEGIN |
68 | xla_utility_pkg.activate_stat; |
69 | <PL/SQL source>(...); |
70 | xla_utility_pkg.deactivate_stat; |
71 | END; |
72 | |
73 | |
74 | D] SQL Trace facilities |
75 | |
76 | Example of calls: |
77 | BEGIN |
78 | .../... |
79 | xla_utility_pkg.set_sqltrace_on; |
80 | .../... |
81 | xla_utility_pkg.set_sqltrace_off; |
82 | .../... |
83 | END; |
84 | |
85 | DEPENDENCIES |
86 | dbms_pipe |
87 | dbms_utility |
88 | dbms_output |
89 | dbms_session |
90 | fnd_file |
91 | fnd_log |
92 | fnd_request |
93 | fnd_global |
94 | |
95 | HISTORY |
96 | 07-Dec-95 P. Labrevois Created |
97 | 08-Feb-01 Created for XLA |
98 | 28-Mar-01 Major review |
99 | 17-Apr-01 Review stat handling |
100 | 08-May-01 Added get_session_info |
101 | 20-Sep-01 Integrated with dbms_trace |
102 | 11-Apr-03 Shishir Joshi Modified call to the raise_message. |
103 | Added parameter name to the call. |
104 | 20-Oct-05 A.Wan 4693865 ATG Profile Options |
105 | profiles obsoleted: |
106 | XLA_DEBUG_DBMS_TRACE |
107 | XLA_DEBUG_DBMS_TRACE_LEVEL |
108 | XLA_DEBUG_DBMS_TRACE_MODE |
109 | XLA_DEBUG_KEEP_GOING |
110 | XLA_DEBUG_SYSSTAT |
111 | code removed: |
112 | KEEP_GOING func and related code |
113 | print_sysstat_data function |
114 | |
115 | |
116 +======================================================================*/
117
118 --
119 -- Constant default location
120 --
121 c_unknown_location CONSTANT VARCHAR2(70) := '_ UNKNOWN ORIGIN _';
122
123 --
124 -- Mode available
125 --
126 c_mode_tracer CONSTANT VARCHAR2(50) := 'TRACER';
127 c_mode_stracer CONSTANT VARCHAR2(50) := 'STRACER';
128 c_mode_jtracer CONSTANT VARCHAR2(50) := 'JTRACER';
129 c_mode_logfile CONSTANT VARCHAR2(50) := 'LOGFILE';
130 c_mode_aflog CONSTANT VARCHAR2(50) := 'AFLOG';
131 c_mode_file CONSTANT VARCHAR2(50) := 'FILE';
132 c_mode_output CONSTANT VARCHAR2(50) := 'OUTPUT';
133 c_mode_htm CONSTANT VARCHAR2(50) := 'HTM';
134
135 --
136 -- Default options set through constants
137 --
138 c_dflt_trace_level CONSTANT PLS_INTEGER := 100;
139 c_dflt_profiler CONSTANT VARCHAR2(1) := 'N';
140 c_dflt_header CONSTANT VARCHAR2(1) := 'Y';
141 c_dflt_footer CONSTANT VARCHAR2(1) := 'Y';
142 c_dflt_trace_datetime CONSTANT VARCHAR2(1) := 'N';
143 c_dflt_sqltrace CONSTANT VARCHAR2(1) := 'N';
144 c_dflt_file_flush_option CONSTANT VARCHAR2(1) := 'N';
145 c_dflt_file_override_directory CONSTANT VARCHAR2(2000):= NULL;
146 c_dflt_file_override_filename CONSTANT VARCHAR2(240) := NULL;
147 c_dflt_trace CONSTANT VARCHAR2(1) := 'N';
148 c_dflt_srs_mode CONSTANT VARCHAR2(30) := c_mode_tracer;
149 c_dflt_of_mode CONSTANT VARCHAR2(30) := c_mode_file;
150 c_dflt_timeout CONSTANT PLS_INTEGER := 600;
151 c_dflt_srs_output_enable CONSTANT VARCHAR2(1) := 'Y';
152
153 --
154 -- Constants for tracer mode
155 --
156 c_pipe_name_suffix CONSTANT VARCHAR2(50) := '_TRC';
157 c_pipe_buffer_size CONSTANT PLS_INTEGER := 65536;
158 c_cp_appli CONSTANT VARCHAR2(50) := 'XLA';
159 c_cp_tracer CONSTANT VARCHAR2(50) := 'XLAMTR';
160 c_cp_stracer CONSTANT VARCHAR2(50) := 'XLAMTS';
161 c_cp_jtracer CONSTANT VARCHAR2(50) := 'XLAMTJ';
162 c_max_msg_pipe CONSTANT PLS_INTEGER := 1950;
163 c_max_msg_output CONSTANT PLS_INTEGER := 255;
164
165 --
166 -- Constants for file mode
167 --
168 c_file_prefix CONSTANT VARCHAR2(10) := 'xla_';
169 c_file_suffix CONSTANT VARCHAR2(10) := '.trc';
170
171 --
172 -- Constants for formatting
173 --
174 c_equal_position PLS_INTEGER := 40;
175 c_equal_symbol VARCHAR2(1);
176
177 --
178 -- Default value options
179 --
180 g_dflt_trace_level PLS_INTEGER;
181 g_dflt_profiler VARCHAR2(1);
182 g_dflt_header VARCHAR2(1);
183 g_dflt_footer VARCHAR2(1);
184 g_dflt_trace_datetime VARCHAR2(1);
185 g_dflt_sqltrace VARCHAR2(1);
186 g_dflt_file_flush_option VARCHAR2(1);
187 g_dflt_file_override_directory VARCHAR2(2000);
188 g_dflt_file_override_filename VARCHAR2(240);
189 g_dflt_trace VARCHAR2(1);
190 g_dflt_srs_mode VARCHAR2(30);
191 g_dflt_of_mode VARCHAR2(30);
192 g_dflt_timeout INTEGER;
193 g_dflt_srs_output_enable VARCHAR2(1);
194
195 --
196 -- Generic global variables
197 --
198 g_trace_datetime VARCHAR2(1);
199 g_header VARCHAR2(1);
200 g_footer VARCHAR2(1);
201 g_sqltrace VARCHAR2(1);
202 g_file_flush_option VARCHAR2(1);
203 g_file_override_directory VARCHAR2(2000);
204 g_file_override_filename VARCHAR2(240);
205 g_srs_mode VARCHAR2(30);
206 g_of_mode VARCHAR2(30);
207 g_timeout INTEGER;
208 g_srs_output_enable VARCHAR2(1);
209 g_debug_mode VARCHAR2(20) := NULL; -- Debug mode requested
210 g_mode VARCHAR2(30); -- Actual debug mode
211 g_location VARCHAR2(255) := NULL;
212 g_RequestId NUMBER := NULL; -- Last request that submitted trace
213
214 --
215 -- Tracer mode specific global variables
216 --
217 g_pipe_name VARCHAR2(100);
218 g_pipename_increment PLS_INTEGER := 0;
219 g_trace_reqid NUMBER; -- Tracer request id
220
221 --
222 -- File mode specific global variables
223 --
224 g_file_handler utl_file.file_type;
225 g_file_directory VARCHAR2(2000);
226 g_file_name VARCHAR2(240);
227
228 --
229 -- File mode specific global variables
230 --
231 g_format VARCHAR2(1);
232
233
234 g_stat_datetime_start PLS_INTEGER;
235 g_stat_datetime_stop PLS_INTEGER;
236
237
238
239 /*======================================================================+
240 | |
241 | |
242 | |
243 | |
244 | |
245 | |
246 | |
247 | |
248 | |
249 | |
250 | |
251 | |
252 | |
253 | |
254 | |
255 | |
256 | |
257 | |
258 | |
259 | |
260 | Options Functions |
261 | |
262 | |
263 | |
264 | |
265 | |
266 | |
267 | |
268 | |
269 | |
270 | |
271 | |
272 | |
273 | |
274 | |
275 | |
276 | |
277 | |
278 | |
279 | |
280 | |
281 +======================================================================*/
282
283 /*======================================================================+
284 | |
285 | Private Procedure |
286 | |
287 | set_default_options |
288 | |
289 | Set the default option. This procedure is called when the package is |
290 | instanciated. |
291 | |
292 +======================================================================*/
293 PROCEDURE set_default_options
294 IS
295 BEGIN
296 g_dflt_trace_level := c_dflt_trace_level;
297 g_dflt_profiler := c_dflt_profiler;
298 g_dflt_header := c_dflt_header;
299 g_dflt_footer := c_dflt_footer;
300 g_dflt_trace_datetime := c_dflt_trace_datetime;
301 g_dflt_sqltrace := c_dflt_sqltrace;
302 g_dflt_file_flush_option := c_dflt_file_flush_option;
303 g_dflt_file_override_directory := c_dflt_file_override_directory;
304 g_dflt_file_override_filename := c_dflt_file_override_filename;
305 g_dflt_trace := c_dflt_trace;
306 g_dflt_srs_mode := c_dflt_srs_mode;
307 g_dflt_of_mode := c_dflt_of_mode;
308 g_dflt_timeout := c_dflt_timeout;
309 g_dflt_srs_output_enable := c_dflt_srs_output_enable;
310 END set_default_options;
311
312
313 /*======================================================================+
314 | |
315 | Private Procedure |
316 | |
317 | set_options |
318 | |
319 | Keep the options set in global variables. |
320 | |
321 +======================================================================*/
322 PROCEDURE set_options
323 IS
324 BEGIN
325 --
326 -- Profile options value take precedance over default values
327 --
328 g_trace_level := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_TRACE_LEVEL') , g_dflt_trace_level);
329 g_profiler := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_PROFILER') , g_dflt_profiler);
330 g_trace_datetime := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_TRACE_DATETIME') , g_dflt_trace_datetime);
331 g_sqltrace := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_SQLTRACE') , g_dflt_sqltrace);
332 g_file_flush_option:= NVL(xla_profiles_pkg.get_value('XLA_DEBUG_FILE_FLUSH_OPTION'), g_dflt_file_flush_option);
333 g_file_override_directory
334 := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_FILE_OVERRIDE_DIRECTORY')
335 , g_dflt_file_override_directory);
336 g_file_override_filename
337 := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_FILE_OVERRIDE_FILENAME')
338 , g_dflt_file_override_filename);
339 g_trace := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_TRACE') , g_dflt_trace);
340 g_srs_mode := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_SRS_MODE') , g_dflt_srs_mode);
341 g_of_mode := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_OF_MODE') , g_dflt_of_mode);
342 g_timeout := NVL(xla_profiles_pkg.get_value('XLA_DEBUG_TIMEOUT') , g_dflt_timeout);
343 g_srs_output_enable:= NVL(xla_profiles_pkg.get_value('XLA_DEBUG_SRS_OUTPUT_ENABLE'), g_dflt_srs_output_enable);
344
345 --
346 -- Evaluate the status of the statistics from both the profiler and the system statistics
347 --
348 IF g_profiler = 'Y' THEN
349 g_stat := 'Y';
350 ELSE
351 g_stat := 'N';
352 END IF;
353
354 g_header := g_dflt_header;
355 g_footer := g_dflt_footer;
356
357 END set_options;
358
359
360 /*======================================================================+
361 | |
362 | Private Procedure |
363 | |
364 | reset_options |
365 | |
366 | Reset all global variables to the default value. Reset as well global |
367 | variables not derived from profile options |
368 | |
369 +======================================================================*/
370 PROCEDURE reset_options
371 IS
372 BEGIN
373 set_options;
374 g_RequestId := NULL;
375 g_pipe_name := NULL;
376 g_location := NULL;
377 END reset_options;
378
379
380 /*======================================================================+
381 | |
382 | |
383 | |
384 | |
385 | |
386 | |
387 | |
388 | |
389 | |
390 | |
391 | |
392 | |
393 | |
394 | |
395 | |
396 | |
397 | |
398 | |
399 | |
400 | |
401 | Private Print Functions |
402 | |
403 | |
404 | |
405 | |
406 | |
407 | |
408 | |
409 | |
410 | |
411 | |
412 | |
413 | |
414 | |
415 | |
416 | |
417 | |
418 | |
419 | |
420 | |
421 | |
422 +======================================================================*/
423
424
425 /*======================================================================+
426 | |
427 | Private Procedure |
428 | |
429 | open-srs_files |
430 | |
431 | Open the temporary log and output files used by the FND concurrent |
432 | processing. |
433 | |
434 +======================================================================*/
435 PROCEDURE open_srs_files
436
437 IS
438
439 BEGIN
440 --
441 -- Print in the SRS output/logfile only if both the current context is inside
442 -- a concurrent request and this output is enabled.
443 --
444 IF g_requestid NOT IN (0,-1)
445 AND g_srs_output_enable = 'Y' THEN
446 fnd_file.put_line(fnd_file.log ,'');
447 fnd_file.put_line(fnd_file.output,'');
448 END IF;
449
450 EXCEPTION
451 WHEN xla_exceptions_pkg.application_exception THEN
452 g_srs_output_enable := 'N';
453 RAISE;
454 WHEN OTHERS THEN
455 g_srs_output_enable := 'N';
456 xla_exceptions_pkg.raise_message
457 (p_location => 'xla_utility_pkg.open_srs_files');
458 END open_srs_files;
459
460
461 /*======================================================================+
462 | |
463 | Private Procedure |
464 | |
465 | get_root_dir |
466 | |
467 | Return the root directory |
468 | |
469 +======================================================================*/
470 FUNCTION get_root_dir
471 (p_path IN VARCHAR2)
472 RETURN VARCHAR2
473
474 IS
475
476 BEGIN
477 IF INSTR(p_path,',',1) = 0 THEN
478 IF INSTR(p_path,';',1) = 0 THEN
479 RETURN SUBSTR(p_path , 1 ,LENGTH(p_path));
480 ELSE
481 RETURN SUBSTR(p_path , 1 ,INSTR(p_path,';',1)-1);
482 END IF;
483 ELSE
484 RETURN SUBSTR(p_path , 1 ,INSTR(p_path,',',1)-1);
485 END IF;
486
487 EXCEPTION
488 WHEN OTHERS THEN
489 xla_exceptions_pkg.raise_message
490 (p_location => 'xla_utility_pkg.get_root_dir');
491 END get_root_dir;
492
493
494 /*======================================================================+
495 | |
496 | Private Procedure |
497 | |
498 | open_file |
499 | |
500 | Get a directory to be written |
501 | |
502 +======================================================================*/
503 PROCEDURE open_file
504
505 IS
506
507 l_parameter_value VARCHAR2(255);
508 l_dir VARCHAR2(255);
509 l_override_directory VARCHAR2(2000);
510 l_override_filename VARCHAR2(2000);
511
512 BEGIN
513
514 SELECT pa.value
515 INTO l_parameter_value
516 FROM v$parameter pa
517 WHERE pa.name = 'utl_file_dir'
518 ;
519
520
521 -- IF xla_utility_event_pkg.is_event_set('RAISE_UTL_FILE_OPEN_FAILURE') THEN
522 -- l_dir := '/dummy';
523 -- ELSE
524
525 --
526 -- Get the directory from the override directory if set
527 --
528 g_file_directory
529 := NVL(g_file_override_directory,get_root_dir (l_parameter_value));
530
531 --
532 -- Get the filename from the override filename if set
533 --
534 g_file_name
535 := NVL(g_file_override_filename
536 ,c_file_prefix
537 || xla_environment_pkg.g_process_id
538 || '_'
539 || xla_environment_pkg.g_session_id
540 || c_file_suffix);
541
542 ---
543 --- The file mode must be opened in 'w' mode in 7.3, otherwise in 'a' mode
544 ---
545 BEGIN
546 g_file_handler := utl_file.fopen(g_file_directory, g_file_name ,'a');
547
548 EXCEPTION
549 WHEN utl_file.invalid_mode THEN
550 g_file_handler := utl_file.fopen(g_file_directory, g_file_name ,'w');
551 END;
552
553 EXCEPTION
554 WHEN xla_exceptions_pkg.application_exception THEN
555 g_trace := 'N';
556 RAISE;
557 WHEN utl_file.invalid_path THEN
558 xla_exceptions_pkg.raise_message
559 ('XLA' , 'XLA_TRACE_FILE_PATH'
560 ,'FILENAME' , g_file_name
561 ,'DIRECTORY' , g_file_directory);
562 WHEN utl_file.invalid_mode THEN
563 xla_exceptions_pkg.raise_message
564 ('XLA' , 'XLA_TRACE_FILE_MODE'
565 ,'FILENAME' , g_file_name
566 ,'DIRECTORY' , g_file_directory);
567 WHEN utl_file.invalid_filehandle THEN
568 xla_exceptions_pkg.raise_message
569 ('XLA' , 'XLA_TRACE_FILE_HANDLE'
570 ,'FILENAME' , g_file_name
571 ,'DIRECTORY' , g_file_directory);
572 WHEN utl_file.invalid_operation THEN
573 xla_exceptions_pkg.raise_message
574 ('XLA' , 'XLA_TRACE_FILE_OPE'
575 ,'FILENAME' , g_file_name
576 ,'DIRECTORY' , g_file_directory);
577 WHEN utl_file.write_error THEN
578 xla_exceptions_pkg.raise_message
579 ('XLA' , 'XLA_TRACE_FILE_WRITE'
580 ,'FILENAME' , g_file_name
581 ,'DIRECTORY' , g_file_directory);
582 WHEN utl_file.internal_error THEN
583 xla_exceptions_pkg.raise_message
584 ('XLA' , 'XLA_TRACE_FILE_ERROR'
585 ,'FILENAME' , g_file_name
586 ,'DIRECTORY' , g_file_directory);
587 WHEN OTHERS THEN
588 xla_exceptions_pkg.raise_message
589 (p_location => 'xla_utility_pkg.open_file');
590 END open_file;
591
592
593 /*======================================================================+
594 | |
595 | Private Procedure |
596 | |
597 | close_file |
598 | |
599 | Get a directory to be written |
600 | |
601 +======================================================================*/
602 PROCEDURE close_file
603
604 IS
605
606 BEGIN
607 utl_file.fclose(g_file_handler);
608
609 EXCEPTION
610 WHEN xla_exceptions_pkg.application_exception THEN
611 g_trace := 'N';
612 RAISE;
613 WHEN utl_file.invalid_path THEN
614 xla_exceptions_pkg.raise_message
615 ('XLA' , 'XLA_TRACE_FILE_PATH'
616 ,'FILENAME' , g_file_name
617 ,'DIRECTORY' , g_file_directory);
618 WHEN utl_file.invalid_mode THEN
619 xla_exceptions_pkg.raise_message
620 ('XLA' , 'XLA_TRACE_FILE_MODE'
621 ,'FILENAME' , g_file_name
622 ,'DIRECTORY' , g_file_directory);
623 WHEN utl_file.invalid_filehandle THEN
624 xla_exceptions_pkg.raise_message
625 ('XLA' , 'XLA_TRACE_FILE_HANDLE'
626 ,'FILENAME' , g_file_name
627 ,'DIRECTORY' , g_file_directory);
628 WHEN utl_file.invalid_operation THEN
629 xla_exceptions_pkg.raise_message
630 ('XLA' , 'XLA_TRACE_FILE_OPE'
631 ,'FILENAME' , g_file_name
632 ,'DIRECTORY' , g_file_directory);
633 WHEN utl_file.write_error THEN
634 xla_exceptions_pkg.raise_message
635 ('XLA' , 'XLA_TRACE_FILE_WRITE'
636 ,'FILENAME' , g_file_name
637 ,'DIRECTORY' , g_file_directory);
638 WHEN utl_file.internal_error THEN
639 xla_exceptions_pkg.raise_message
640 ('XLA' , 'XLA_TRACE_FILE_ERROR'
641 ,'FILENAME' , g_file_name
642 ,'DIRECTORY' , g_file_directory);
643 WHEN OTHERS THEN
644 xla_exceptions_pkg.raise_message
645 (p_location => 'xla_utility_pkg.close_file');
646 END close_file;
647
648
649 /*======================================================================+
650 | |
651 | Private Procedure |
652 | |
653 | convert_msg |
654 | |
655 | Convert the message to place the symbol = after 25 characters |
656 | |
657 +======================================================================*/
658 FUNCTION convert_msg
659 (p_msg IN VARCHAR2)
660 RETURN VARCHAR2
661
662 IS
663
664 l_equal_position INTEGER ;
665 l_pos INTEGER;
666 l_datetime VARCHAR2(30);
667 l_new_msg VARCHAR2(2000);
668 l_msg VARCHAR2(2000);
669
670 BEGIN
671
672 c_equal_symbol := '=';
673
674 IF g_format = 'N' THEN
675 RETURN p_msg;
676 END IF;
677
678 IF g_trace_datetime = 'Y' THEN
679 l_equal_position := c_equal_position + 20;
680 l_datetime := TO_CHAR(sysdate,'DD-MON HH24:MI:SS');
681 ELSE
682 l_equal_position := c_equal_position;
683 END IF;
684
685 l_pos := NVL(INSTR(p_msg,c_equal_symbol,1,1),0);
686
687 IF l_pos = 0 THEN
688 l_new_msg := p_msg;
689 ELSE
690 IF l_pos = l_equal_position THEN
691 l_new_msg := p_msg;
692 ELSIF l_pos < l_equal_position THEN
693 l_new_msg := RPAD(NVL(SUBSTR(RTRIM(REPLACE(p_msg,' ',' ')),1,l_pos-1),'@'),l_equal_position-1,' ')||'='||SUBSTR(p_msg,l_pos+1);
694 ELSE
695 --
696 -- Symbol is after the threshold.
697 -- PLAB: To review to handle nested new lines
698 --
699 l_new_msg := SUBSTR(p_msg,1,l_pos-1)
700 || xla_environment_pkg.g_chr_newline
701 || ' '||LPAD('=',l_equal_position-1,' ')
702 || SUBSTR(p_msg,l_pos+1);
703 END IF;
704 END IF;
705
706 IF g_trace_datetime = 'Y' THEN
707 --
708 -- Add the time on the left side and left pad the new line character
709 -- with the space allocated to the timing
710 --
711 RETURN l_datetime || ' '||REPLACE(l_new_msg,xla_environment_pkg.g_chr_newline
712 ,xla_environment_pkg.g_chr_newline || RPAD(' ',16,' '));
713 ELSE
714 RETURN l_new_msg;
715 END IF;
716 END convert_msg;
717
718
719 /*======================================================================+
720 | |
721 | Private Procedure |
722 | |
723 | print_output |
724 | |
725 | Print the messgae to the standard dbms_output |
726 | |
727 | Parameters |
728 | 1 IN p_msg VARCHAR2 Debug message |
729 | |
730 +======================================================================*/
731 PROCEDURE print_output
732 (p_msg IN VARCHAR2)
733
734 IS
735
736 l_length NUMBER;
737 l_compt NUMBER;
738 l_sub VARCHAR2(4000);
739 l_pos NUMBER;
740 l_l NUMBER;
741
742 BEGIN
743 l_length := LENGTHB(p_msg);
744 l_compt := 1;
745 WHILE (l_compt <= l_length) LOOP
746 BEGIN
747 l_pos := INSTR(p_msg,xla_environment_pkg.g_chr_newline,l_compt,1);
748 IF ((l_pos = 0) OR ((l_pos -l_compt) > c_max_msg_output)) THEN
749 l_l := LEAST(c_max_msg_output,l_length-l_compt+1);
750 l_sub := SUBSTR(p_msg,l_compt,l_l);
751 l_compt := l_compt+l_l;
752 ELSE
753 l_l := l_pos - l_compt;
754 l_sub := SUBSTR(p_msg,l_compt,l_l);
755 l_compt := l_compt+l_l+1;
756 END IF;
757 END;
758 END LOOP;
759 END print_output;
760
761
762 /*======================================================================+
763 | |
764 | Private Procedure |
765 | |
766 | print_html |
767 | |
768 | Print the messgae to the standard dbms_output |
769 | |
770 | Parameters |
771 | 1 IN p_msg VARCHAR2 Debug message |
772 | |
773 +======================================================================*/
774 PROCEDURE print_html
775 (p_msg IN VARCHAR2)
776
777 IS
778
779 BEGIN
780 htp.p(p_msg);
781 END print_html;
782
783
784 /*======================================================================+
785 | |
786 | Private Procedure |
787 | |
788 | print_fndfile |
789 | |
790 | Print the messgage to the fndfile |
791 | |
792 | Parameters |
793 | 1 IN p_msg VARCHAR2 Debug message |
794 | |
795 +======================================================================*/
796 PROCEDURE print_fndfile
797 (p_msg IN VARCHAR2)
798
799 IS
800
801 BEGIN
802 fnd_file.put_line(fnd_file.log,p_msg);
803
804 -- IF xla_utility_event_pkg.is_event_set('RAISE_FND_FILE_OPEN_FAILURE') THEN
805 -- RAISE utl_file.invalid_path;
806 -- END IF;
807
808 EXCEPTION
809 WHEN xla_exceptions_pkg.application_exception THEN
810 g_srs_output_enable := 'N';
811 RAISE;
812 WHEN OTHERS THEN
813 g_srs_output_enable := 'N';
814 xla_exceptions_pkg.raise_message
815 (p_location => 'xla_utility_pkg.print_fndfile');
816 END print_fndfile;
817
818
819 /*======================================================================+
820 | |
821 | Private Procedure |
822 | |
823 | print_aflog |
824 | |
825 | Print the messgage to the af log |
826 | |
827 | Parameters |
828 | 1 IN p_msg VARCHAR2 Debug message |
829 | |
830 +======================================================================*/
831 PROCEDURE print_aflog
832 (p_msg IN VARCHAR2)
833
834 IS
835
836 BEGIN
837 IF fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL THEN
838 fnd_log.string
839 (fnd_log.LEVEL_STATEMENT ,'xla-plsql' ,p_msg);
840 END IF;
841
842 EXCEPTION
843 WHEN xla_exceptions_pkg.application_exception THEN
844 RAISE;
845 WHEN OTHERS THEN
846 xla_exceptions_pkg.raise_message
847 (p_location => 'xla_utility_pkg.print_aflog');
848 END print_aflog;
849
850
851 /*======================================================================+
852 | |
853 | Private Procedure |
854 | |
855 | print_fndfile |
856 | |
857 | Print the messgage to the fndfile |
858 | |
859 | Parameters |
860 | 1 IN p_msg VARCHAR2 Debug message |
861 | |
862 +======================================================================*/
863 PROCEDURE print_file
864 (p_msg IN VARCHAR2)
865
866 IS
867
868 BEGIN
869 utl_file.put_line(g_file_handler,p_msg);
870
871 IF g_file_flush_option = 'Y' THEN
872 utl_file.fflush(g_file_handler);
873 END IF;
874
875 EXCEPTION
876 WHEN xla_exceptions_pkg.application_exception THEN
877 g_trace := 'N';
878 RAISE;
879 WHEN utl_file.invalid_path THEN
880 xla_exceptions_pkg.raise_message
881 ('XLA' , 'XLA_TRACE_FILE_PATH'
882 ,'FILENAME' , g_file_name
883 ,'DIRECTORY' , g_file_directory);
884 WHEN utl_file.invalid_mode THEN
885 xla_exceptions_pkg.raise_message
886 ('XLA' , 'XLA_TRACE_FILE_MODE'
887 ,'FILENAME' , g_file_name
888 ,'DIRECTORY' , g_file_directory);
889 WHEN utl_file.invalid_filehandle THEN
890 xla_exceptions_pkg.raise_message
891 ('XLA' , 'XLA_TRACE_FILE_HANDLE'
892 ,'FILENAME' , g_file_name
893 ,'DIRECTORY' , g_file_directory);
894 WHEN utl_file.invalid_operation THEN
895 xla_exceptions_pkg.raise_message
896 ('XLA' , 'XLA_TRACE_FILE_OPE'
897 ,'FILENAME' , g_file_name
898 ,'DIRECTORY' , g_file_directory);
899 WHEN utl_file.write_error THEN
900 xla_exceptions_pkg.raise_message
901 ('XLA' , 'XLA_TRACE_FILE_WRITE'
902 ,'FILENAME' , g_file_name
903 ,'DIRECTORY' , g_file_directory);
904 WHEN utl_file.internal_error THEN
905 xla_exceptions_pkg.raise_message
906 ('XLA' , 'XLA_TRACE_FILE_ERROR'
907 ,'FILENAME' , g_file_name
908 ,'DIRECTORY' , g_file_directory);
909 WHEN OTHERS THEN
910 g_trace := 'N';
911 xla_exceptions_pkg.raise_message
912 (p_location => 'xla_utility_pkg.print_file');
913 END print_file;
914
915
916 /*======================================================================+
917 | |
918 | Private Procedure |
919 | |
920 | send_pipe |
921 | |
922 | Print the message to the pipe. |
923 | |
924 +======================================================================*/
925 PROCEDURE send_pipe
926 (p_msg IN VARCHAR2)
927
928 IS
929
930 l_cr NUMBER;
931 BEGIN
932 dbms_pipe.pack_message(NVL(p_msg,' ') );
933 l_cr := dbms_pipe.send_message(g_pipe_name,g_timeout,c_pipe_buffer_size);
934 IF l_cr <> 0 THEN
935 IF l_cr = 1 THEN
936 --
937 -- Switch the trace to OFF to avoid indefinite recursive loop
938 --
939 g_trace := 'N';
940 xla_exceptions_pkg.raise_message
941 (p_appli_s_name => 'XLA'
942 , p_msg_name => 'XLA_TRACE_PIPE_TIMEOUT');
943 ELSIF l_cr = 3 THEN
944 --
945 -- Switch the trace to OFF to avoid indefinite recursive loop
946 --
947 g_trace := 'N';
948 xla_exceptions_pkg.raise_message
949 (p_appli_s_name => 'XLA'
950 ,p_msg_name => 'XLA_TRACE_PIPE_ERROR');
951 ELSE
952 --
953 -- Switch the trace to OFF to avoid indefinite recursive loop
954 --
955 g_trace := 'N';
956 xla_exceptions_pkg.raise_message ('XLA' , 'XLA_TRACE_PIPE_ERROR2'
957 ,'ERROR' , l_cr);
958 END IF;
959 END IF;
960 EXCEPTION
961 WHEN xla_exceptions_pkg.application_exception THEN
962 RAISE;
963 WHEN OTHERS THEN
964 xla_exceptions_pkg.raise_message
965 (p_location => 'xla_utility_pkg.send_pipe');
966 END send_pipe;
967
968
969 /*======================================================================+
970 | |
971 | Private Procedure |
972 | |
973 | print_pipe |
974 | |
975 | Print the message to the pipe |
976 | |
977 +======================================================================*/
978 PROCEDURE print_pipe
979 (p_msg IN VARCHAR2)
980
981 IS
982
983 l_length NUMBER;
984 l_compt NUMBER;
985 l_sub VARCHAR2(4000);
986 l_pos NUMBER;
987 l_l NUMBER;
988
989 BEGIN
990 l_length := LENGTHB(p_msg);
991 l_compt := 1;
992 WHILE (l_compt <= l_length) LOOP
993 BEGIN
994 l_pos := INSTR(p_msg,xla_environment_pkg.g_chr_newline,l_compt,1);
995 IF ((l_pos = 0) OR ((l_pos -l_compt) > c_max_msg_pipe)) THEN
996 l_l := LEAST(c_max_msg_pipe,l_length-l_compt+1);
997 l_sub := SUBSTR(p_msg,l_compt,l_l);
998 l_compt := l_compt+l_l;
999 ELSE
1000 l_l := l_pos - l_compt;
1001 l_sub := SUBSTR(p_msg,l_compt,l_l);
1002 l_compt := l_compt+l_l+1;
1003 END IF;
1004 send_pipe(l_sub);
1005 END;
1006 END LOOP;
1007 END print_pipe;
1008
1009
1010 /*======================================================================+
1011 | |
1012 | Private Function |
1013 | |
1014 | set_unique_session_info |
1015 | |
1016 | Set the pipe name. |
1017 | |
1018 +======================================================================*/
1019 PROCEDURE set_unique_session_info
1020
1021 IS
1022
1023 BEGIN
1024 g_pipename_increment := g_pipename_increment + 1;
1025 g_pipe_name := xla_environment_pkg.g_session_name
1026 || '_'
1027 || LTRIM(RTRIM(TO_CHAR(g_pipename_increment)))
1028 || c_pipe_name_suffix;
1029 g_unique_location := REPLACE(g_location ,'''','')
1030 || '_'
1031 || xla_environment_pkg.g_session_name
1032 || '_'
1033 || LTRIM(RTRIM(TO_CHAR(g_pipename_increment)));
1034 END set_unique_session_info;
1035
1036
1037 /*======================================================================+
1038 | |
1039 | Private Procedure |
1040 | |
1041 | stop_tracer |
1042 | |
1043 | Stop the tracer by sending the STOP message. Any error is ignored. |
1044 | |
1045 +======================================================================*/
1046 PROCEDURE stop_tracer
1047
1048 IS
1049
1050 l_cr NUMBER;
1051 BEGIN
1052 dbms_pipe.pack_message('STOP');
1053 l_cr := dbms_pipe.send_message(g_pipe_name,g_timeout,c_pipe_buffer_size);
1054
1055 EXCEPTION
1056 WHEN xla_exceptions_pkg.application_exception THEN
1057 g_trace := 'N';
1058 RAISE;
1059 WHEN OTHERS THEN
1060 g_trace := 'N';
1061 xla_exceptions_pkg.raise_message
1062 (p_location => 'xla_utility_pkg.stop_tracer');
1063 END stop_tracer;
1064
1065
1066 /*======================================================================+
1067 | |
1068 | Private Function |
1069 | |
1070 | SubmitTracer |
1071 | |
1072 | Call the tracer |
1073 | |
1074 | Return |
1075 | 0 Success |
1076 | 2 Failure |
1077 | |
1078 +======================================================================*/
1079 PROCEDURE SubmitTracer
1080 IS
1081
1082 PRAGMA autonomous_transaction;
1083 l_reqid NUMBER;
1084 l_temp VARCHAR2(255);
1085
1086 BEGIN
1087
1088 IF g_debug_mode = 'OF' THEN
1089 l_temp := g_location;
1090 ELSE
1091 IF g_RequestId NOT IN (0,-1) THEN
1092 l_temp := TO_CHAR(g_RequestId);
1093 ELSE
1094 l_temp := g_location;
1095 END IF;
1096 END IF;
1097
1098 IF g_mode = c_mode_stracer THEN
1099 l_reqid := fnd_request.submit_request (c_cp_appli
1100 ,c_cp_stracer
1101 ,description => 'Trace '||l_temp
1102 ,argument1 => g_pipe_name) ;
1103 IF l_reqid = 0 THEN
1104 l_reqid := fnd_request.submit_request (c_cp_appli
1105 ,c_cp_tracer
1106 ,description => 'Trace '||l_temp
1107 ,argument1 => g_pipe_name);
1108 END IF;
1109 ELSIF g_mode = c_mode_jtracer THEN
1110 l_reqid := fnd_request.submit_request (c_cp_appli
1111 ,c_cp_jtracer
1112 ,description => 'Trace '||l_temp
1113 ,argument1 => g_pipe_name) ;
1114 IF l_reqid = 0 THEN
1115 l_reqid := fnd_request.submit_request (c_cp_appli
1116 ,c_cp_tracer
1117 ,description => 'Trace '||l_temp
1118 ,argument1 => g_pipe_name);
1119 END IF;
1120
1121 ELSE
1122 l_reqid := fnd_request.submit_request (c_cp_appli
1123 ,c_cp_tracer
1124 ,description => 'Trace '||l_temp
1125 ,argument1 => g_pipe_name);
1126 END IF;
1127
1128 IF l_reqid = 0 THEN
1129 RAISE xla_exceptions_pkg.application_exception;
1130 END IF;
1131
1132 g_trace_reqid := l_reqid;
1133 COMMIT;
1134
1135 IF g_trace = 'Y' THEN
1136 dbms_pipe.purge(g_pipe_name);
1137 dbms_pipe.reset_buffer;
1138 END IF;
1139 END SubmitTracer;
1140
1141
1142 /*======================================================================+
1143 | |
1144 | Private Procedure |
1145 | |
1146 | print_header |
1147 | |
1148 | Printer the standard header |
1149 | |
1150 +======================================================================*/
1151 PROCEDURE print_header
1152
1153 IS
1154
1155 BEGIN
1156 IF g_header = 'Y' THEN
1157 trace('Utilities activated' ,-10);
1158 trace(RPAD('+',76,'-')||'+' ,-10);
1159 trace('Revision = $Revision: 120.11 $' ,-10);
1160 trace('Datetime = ' || TO_CHAR(sysdate,'DD-MON-YYYY HH24:MI:SS')
1161 ,-10);
1162 trace('OS Module = ' || xla_environment_pkg.g_module ,-10);
1163 trace('OS Process id = ' || xla_environment_pkg.g_process_id, -10);
1164 trace('RDBMS Session id = ' || xla_environment_pkg.g_session_id, -10);
1165 trace('SRS Program = ' || xla_environment_pkg.g_program ,-10);
1166 trace('Location = ' || g_location ,-10);
1167 trace('Timeout = ' || g_timeout ,-10);
1168 trace('Type = ' || g_debug_mode ,-10);
1169 trace('Mode = ' || g_mode ,-10);
1170 trace('File flush = ' || g_file_flush_option ,-10);
1171 trace('SRS output enabled = ' || g_srs_output_enable ,-10);
1172 trace('Trace enabled = ' || g_trace ,-10);
1173 trace('Trace Level = ' || g_trace_level ,-10);
1174 trace('Profiler enabled = ' || g_profiler ,-10);
1175 trace('Profiler location = ' || g_unique_location ,-10);
1176 trace(RPAD('+',76,'-')||'+' ,-10);
1177 END IF;
1178 END;
1179
1180
1181 /*======================================================================+
1182 | |
1183 | Private Procedure |
1184 | |
1185 | print_footer |
1186 | |
1187 | Printer the standard footer |
1188 | |
1189 +======================================================================*/
1190 PROCEDURE print_footer
1191
1192 IS
1193
1194 BEGIN
1195 IF g_footer = 'Y' THEN
1196 trace(RPAD('+',76,'-')||'+' ,-10);
1197 trace('Utilities deactivated' ,-10);
1198 trace('Datetime = ' || TO_CHAR(sysdate,'DD-MON-YYYY HH24:MI:SS')
1199 ,-10);
1200 trace('Trace Origin Location = ' || g_location ,-10);
1201 END IF;
1202 END;
1203
1204
1205 /*======================================================================+
1206 | |
1207 | |
1208 | |
1209 | |
1210 | |
1211 | |
1212 | |
1213 | |
1214 | |
1215 | |
1216 | |
1217 | |
1218 | |
1219 | |
1220 | |
1221 | |
1222 | |
1223 | |
1224 | |
1225 | |
1226 | Activate/Deactivate |
1227 | |
1228 | |
1229 | |
1230 | |
1231 | |
1232 | |
1233 | |
1234 | |
1235 | |
1236 | |
1237 | |
1238 | |
1239 | |
1240 | |
1241 | |
1242 | |
1243 | |
1244 | |
1245 | |
1246 | |
1247 +======================================================================*/
1248
1249 /*======================================================================+
1250 | |
1251 | Public Procedure |
1252 | |
1253 | Activate |
1254 | |
1255 | Activate the XLA Debug mode. |
1256 | |
1257 +======================================================================*/
1258 PROCEDURE Activate
1259 (p_debug_mode IN VARCHAR2
1260 ,p_Location IN VARCHAR2)
1261
1262 IS
1263
1264 BEGIN
1265 IF NOT g_debug THEN
1266
1267 --
1268 -- Debug if OFF, or (in a very few cases) switched back from ON to OFF
1269 --
1270
1271 IF NVL(g_location,'UNKNOWN') = 'UNKNOWN' THEN
1272
1273 --
1274 -- First debug initialization.
1275 -- Keep the location where the first init_trace has been requested.
1276 --
1277 g_Location := p_Location;
1278
1279 ---
1280 --- Determinate the options for the session
1281 ---
1282 set_unique_session_info;
1283 set_options;
1284
1285 IF p_debug_mode IN ('SRS_DBP','OR','OF') THEN
1286
1287 --
1288 -- Caller is either SRS, Reports, Forms, conditionnally set
1289 --
1290
1291 --
1292 -- Get the request id. This will be used to determinate if the program is running within a
1293 -- concurrent program or not.
1294 -- A direct call to fnd is used to avoid side effects when the debug is implicity launched
1295 --
1296 g_RequestId := fnd_global.conc_request_id;
1297
1298 IF g_trace = 'Y'
1299 OR g_stat = 'Y' THEN
1300
1301 --
1302 -- Debug is ON
1303 --
1304 g_debug_mode := p_debug_mode;
1305
1306 ---
1307 --- Logfile is supported for SRS_DBP ONLY
1308 ---
1309 IF g_debug_mode IN ('SRS_DBP','DBP') THEN
1310 g_mode := g_srs_mode;
1311 ELSIF g_debug_mode IN ('OF') THEN
1312 g_mode := g_of_mode;
1313 END IF;
1314
1315 --
1316 -- Depending on the mode
1317 -- * Launch the tracer
1318 -- * open the file
1319 --
1320 IF g_mode IN (c_mode_tracer
1321 ,c_mode_stracer
1322 ,c_mode_jtracer) THEN
1323
1324 SubmitTracer;
1325 ELSIF g_mode = 'FILE' THEN
1326 open_file;
1327 END IF;
1328
1329 --
1330 -- Switch the trace ON after initialization
1331 --
1332 g_debug := TRUE;
1333
1334 END IF;
1335
1336 --
1337 -- Open SRS files since the first call may perform a commit.
1338 --
1339 -- This call must be made in SRS context. To verify this, we check whether the Trace
1340 -- is ON or OFF for SRS_DBP calls
1341 --
1342 IF p_debug_mode IN ('SRS_DBP') THEN
1343 open_srs_files;
1344 END IF;
1345
1346 ELSIF p_debug_mode IN ('OUTPUT') THEN
1347
1348 --
1349 -- Trace activated from SQL*Plus or SQL*Dba
1350 -- The level trace is setup to the max level
1351 --
1352 g_debug_mode := p_debug_mode;
1353 g_mode := g_debug_mode;
1354 g_RequestId := NULL;
1355 g_Location := p_Location;
1356 g_debug := TRUE;
1357
1358
1359 ELSIF p_debug_mode IN ('STD_DBP') THEN
1360
1361 --
1362 -- Trace undirectly activated from non XLA packages
1363 --
1364 IF g_trace = 'Y' THEN
1365 open_file;
1366 g_debug_mode := p_debug_mode;
1367 g_mode := g_debug_mode;
1368 g_RequestId := NULL;
1369 g_Location := p_Location;
1370 g_debug := TRUE;
1371 END IF;
1372
1373 ELSIF p_debug_mode IN ('FILE') THEN
1374
1375 --
1376 -- Trace activated from one anonymous package from SQL*Plus
1377 --
1378 open_file;
1379 g_debug_mode := p_debug_mode;
1380 g_mode := g_debug_mode;
1381 g_RequestId := NULL;
1382 g_Location := p_Location;
1383 g_debug := TRUE;
1384
1385 ELSIF p_debug_mode IN ('HTML','HTM') THEN
1386
1387 --
1388 -- Trace activated from one anonymous package from SQL*Plus
1389 --
1390
1391 g_debug_mode := p_debug_mode;
1392 g_mode := g_debug_mode;
1393 g_RequestId := NULL;
1394 g_Location := p_Location;
1395 g_debug := TRUE;
1396
1397 ELSIF p_debug_mode IN ('AFLOG') THEN
1398
1399 --
1400 -- Trace activated in AFLOG mode
1401 --
1402
1403 g_debug_mode := p_debug_mode;
1404 g_mode := g_debug_mode;
1405 g_RequestId := NULL;
1406 g_Location := p_Location;
1407 g_debug := TRUE;
1408
1409 END IF;
1410
1411 IF g_stat = 'Y' THEN
1412 set_stat_on;
1413 END IF;
1414
1415 --
1416 -- Print the standard header
1417 --
1418 print_header;
1419
1420 END IF;
1421 END IF;
1422 END Activate;
1423
1424
1425
1426 /*======================================================================+
1427 | |
1428 | Public Procedure |
1429 | |
1430 | deactivate |
1431 | |
1432 | De-Activate, if set, the XLA utility mode. |
1433 | |
1434 +======================================================================*/
1435 PROCEDURE Deactivate
1436 (p_Location IN VARCHAR2)
1437 IS
1438
1439 l_timeout INTEGER;
1440 l_old_stat VARCHAR2(1);
1441
1442 BEGIN
1443
1444 --
1445 -- Need to handle situation when origin location = ending location
1446 --
1447 IF g_location = p_Location THEN
1448
1449 --
1450 -- Unactivate the stat, if enabled
1451 --
1452 l_old_stat := g_stat;
1453
1454 IF g_stat = 'Y' THEN
1455 set_stat_off;
1456 END IF;
1457
1458 --
1459 -- Need to print a footer when Trace or Stat is ON
1460 --
1461 IF g_debug THEN
1462
1463 ---
1464 --- Handle timeouts/write failures, forced to 20 seconds
1465 ---
1466 l_timeout := g_timeout;
1467 g_timeout := 20;
1468
1469 BEGIN
1470 --
1471 -- Print the standard footer as well as the statistics
1472 --
1473 IF l_old_stat = 'Y' THEN
1474 print_stat_info;
1475 END IF;
1476
1477 print_footer;
1478
1479 EXCEPTION
1480 WHEN xla_exceptions_pkg.application_exception THEN
1481 NULL;
1482 END;
1483
1484 --
1485 -- Reset the timeout to the actual value
1486 --
1487 l_timeout := g_timeout;
1488
1489 --
1490 -- If any of them apply
1491 -- Shutdown the tracer
1492 -- Close the file
1493 --
1494 IF g_mode IN (c_mode_tracer
1495 ,c_mode_stracer
1496 ,c_mode_jtracer) THEN
1497
1498 BEGIN
1499 stop_tracer;
1500 EXCEPTION
1501 WHEN xla_exceptions_pkg.application_exception THEN
1502 NULL;
1503 END;
1504 ELSIF g_mode IN ('FILE') THEN
1505 close_file;
1506 END IF;
1507 END IF;
1508
1509 --
1510 -- Reset all variables
1511 --
1512 g_debug := FALSE;
1513
1514 reset_options;
1515 ELSE
1516 trace('Deactivate rejected = ' || p_location , 10);
1517 END IF;
1518 END DeActivate;
1519
1520
1521
1522 /*======================================================================+
1523 | |
1524 | Public Procedure |
1525 | |
1526 | set_location |
1527 | |
1528 | Set any option. |
1529 | |
1530 +======================================================================*/
1531 PROCEDURE set_option
1532 (p_option IN VARCHAR2
1533 ,p_option_value IN VARCHAR2)
1534
1535 IS
1536
1537 BEGIN
1538 IF p_option = 'TRACE_LEVEL' THEN
1539 g_dflt_trace_level := p_option_value;
1540 ELSIF p_option = 'PROFILER' THEN
1541 g_dflt_profiler := p_option_value;
1542 ELSIF p_option = 'HEADER' THEN
1543 g_dflt_header := p_option_value;
1544 ELSIF p_option = 'FOOTER' THEN
1545 g_dflt_footer := p_option_value;
1546 ELSIF p_option = 'TRACE_DATETIME' THEN
1547 g_dflt_trace_datetime := p_option_value;
1548 ELSIF p_option = 'SQLTRACE' THEN
1549 g_dflt_sqltrace := p_option_value;
1550 ELSIF p_option = 'FILE_FLUSH_OPTION' THEN
1551 g_dflt_file_flush_option := p_option_value;
1552 ELSIF p_option = 'FILE_OVERRIDE_DIRECTORY' THEN
1553 g_dflt_file_override_directory := p_option_value;
1554 ELSIF p_option = 'FILE_OVERRIDE_FILENAME' THEN
1555 g_dflt_file_override_filename := p_option_value;
1556 ELSIF p_option = 'TRACE' THEN
1557 g_dflt_trace := p_option_value;
1558 ELSIF p_option = 'SRS_MODE' THEN
1559 g_dflt_srs_mode := p_option_value;
1560 ELSIF p_option = 'OF_MODE' THEN
1561 g_dflt_of_mode := p_option_value;
1562 ELSIF p_option = 'TIMEOUT' THEN
1563 g_dflt_timeout := p_option_value;
1564 ELSIF p_option = 'SRS_OUTPUT_ENABLE' THEN
1565 g_dflt_srs_output_enable := p_option_value;
1566 ELSE
1567 xla_exceptions_pkg.raise_message
1568 ('XLA' ,'XLA_INTERNAL_ERROR'
1569 ,'ERROR' ,'Invalid option '||p_option
1570 ,'LOCATION' ,'xla_utility_pkg.set_option');
1571 END IF;
1572 END set_option;
1573
1574
1575 /*======================================================================+
1576 | |
1577 | |
1578 | |
1579 | |
1580 | |
1581 | |
1582 | |
1583 | |
1584 | |
1585 | |
1586 | |
1587 | |
1588 | |
1589 | |
1590 | |
1591 | |
1592 | |
1593 | |
1594 | |
1595 | |
1596 | Tracer |
1597 | |
1598 | |
1599 | |
1600 | |
1601 | |
1602 | |
1603 | |
1604 | |
1605 | |
1606 | |
1607 | |
1608 | |
1609 | |
1610 | |
1611 | |
1612 | |
1613 | |
1614 | |
1615 | |
1616 | |
1617 +======================================================================*/
1618
1619
1620 /*======================================================================+
1621 | |
1622 | |
1623 | |
1624 | |
1625 | |
1626 | Public Trace procedures |
1627 | |
1628 | |
1629 | |
1630 | |
1631 | |
1632 +======================================================================*/
1633
1634 /*======================================================================+
1635 | |
1636 | Public Procedure |
1637 | |
1638 | Activate_trace |
1639 | |
1640 | Activate, if set, the XLA Trace. |
1641 | |
1642 +======================================================================*/
1643 PROCEDURE Activate_trace
1644 (p_debug_mode IN VARCHAR2
1645 ,p_location IN VARCHAR2)
1646
1647 IS
1648
1649 BEGIN
1650 IF NOT g_debug THEN
1651 g_dflt_trace := 'Y';
1652
1653 activate
1654 (p_debug_mode => p_debug_mode
1655 ,p_location => p_location);
1656
1657 END IF;
1658 END Activate_trace;
1659
1660
1661 /*======================================================================+
1662 | |
1663 | Public Procedure |
1664 | |
1665 | DeActivate_trace |
1666 | |
1667 | De-Activate, if set, the XLA Trace, if called by the same funtion that|
1668 | activated. |
1669 | |
1670 +======================================================================*/
1671 PROCEDURE Deactivate_trace
1672 (p_Location IN VARCHAR2 )
1673
1674 IS
1675
1676 BEGIN
1677 deactivate
1678 (p_location => p_location);
1679 END Deactivate_trace;
1680
1681
1682 /*======================================================================+
1683 | |
1684 | Public Procedure |
1685 | |
1686 | set_traceoff |
1687 | |
1688 | Switch the trace off. |
1689 | |
1690 +======================================================================*/
1691 PROCEDURE set_trace_off
1692
1693 IS
1694
1695 BEGIN
1696 g_trace := 'N';
1697 END set_trace_off;
1698
1699
1700 /*======================================================================+
1701 | |
1702 | Public Procedure |
1703 | |
1704 | set_trace_on |
1705 | |
1706 | Switch the trace on. |
1707 | |
1708 +======================================================================*/
1709 PROCEDURE set_trace_on
1710
1711 IS
1712
1713 BEGIN
1714 g_trace := 'Y';
1715 END set_trace_on;
1716
1717
1718 /*======================================================================+
1719 | |
1720 | Public Procedure |
1721 | |
1722 | trace |
1723 | |
1724 | Print the trace message |
1725 | |
1726 +======================================================================*/
1727 PROCEDURE trace
1728 (p_msg IN VARCHAR2
1729 ,p_level IN NUMBER )
1730
1731 IS
1732
1733 l_cr INTEGER;
1734
1735 BEGIN
1736 IF ((g_trace = 'Y'
1737 AND p_level <= g_trace_level
1738 AND g_trace_level >= 0)
1739 OR (g_trace = 'Y'
1740 AND p_level >= ABS(g_trace_level )
1741 AND g_trace_level < 0)
1742 OR (g_trace = 'N'
1743 AND p_level < 0))
1744 AND g_debug THEN
1745 print(p_msg);
1746 END IF;
1747 END trace;
1748
1749
1750 /*======================================================================+
1751 | |
1752 | Public Procedure |
1753 | |
1754 | print_trace_info |
1755 | |
1756 | Print all information related to the trace to the std Trace output. |
1757 | |
1758 +======================================================================*/
1759 PROCEDURE print_trace_info
1760
1761 IS
1762
1763 BEGIN
1764 NULL;
1765 END print_trace_info;
1766
1767
1768 /*======================================================================+
1769 | |
1770 | Public Function |
1771 | |
1772 | get_session_info |
1773 | |
1774 | Return system informations about the current session. |
1775 | |
1776 +======================================================================*/
1777 FUNCTION get_session_info
1778 (p_option IN VARCHAR2)
1779 RETURN VARCHAR2
1780
1781 IS
1782
1783 BEGIN
1784 IF p_option = 'SESSION_ID' THEN
1785 RETURN xla_environment_pkg.g_session_id;
1786 ELSIF p_option = 'PROCESS_ID' THEN
1787 RETURN xla_environment_pkg.g_process_id;
1788 ELSE
1789 xla_exceptions_pkg.raise_message
1790 ('XLA' ,'XLA_INTERNAL_ERROR'
1791 ,'ERROR' ,'Invalid option '||p_option
1792 ,'LOCATION' ,'xla_utility_pkg.get_session_info');
1793 END IF;
1794 END get_session_info;
1795
1796
1797 /*======================================================================+
1798 | |
1799 | Public Function |
1800 | |
1801 | get_option_value |
1802 | |
1803 | Set any option. |
1804 | |
1805 +======================================================================*/
1806 FUNCTION get_option_value
1807 (p_option IN VARCHAR2)
1808 RETURN VARCHAR2
1809 IS
1810 BEGIN
1811 IF p_option = 'TIMEOUT' THEN
1812 RETURN g_timeout;
1813 ELSIF p_option = 'DEBUG' THEN
1814 RETURN g_trace;
1815 ELSIF p_option = 'TRACE_LEVEL' THEN
1816 RETURN g_trace_level;
1817 ELSE
1818 xla_exceptions_pkg.raise_message
1819 ('XLA' ,'XLA_INTERNAL_ERROR'
1820 ,'ERROR' ,'Invalid option '||p_option
1821 ,'LOCATION' ,'xla_utility_pkg.get_session_info');
1822 END IF;
1823 END;
1824
1825
1826 /*======================================================================+
1827 | |
1828 | |
1829 | |
1830 | |
1831 | |
1832 | |
1833 | |
1834 | |
1835 | |
1836 | |
1837 | |
1838 | |
1839 | |
1840 | |
1841 | |
1842 | |
1843 | |
1844 | |
1845 | |
1846 | |
1847 | Print |
1848 | |
1849 | |
1850 | |
1851 | |
1852 | |
1853 | |
1854 | |
1855 | |
1856 | |
1857 | |
1858 | |
1859 | |
1860 | |
1861 | |
1862 | |
1863 | |
1864 | |
1865 | |
1866 | |
1867 | |
1868 +======================================================================*/
1869
1870 /*======================================================================+
1871 | |
1872 | Public Procedure |
1873 | |
1874 | print |
1875 | |
1876 | Debugging. Msg will be printed in the std debug output. |
1877 | |
1878 +======================================================================*/
1879 PROCEDURE print
1880 (p_msg IN VARCHAR2)
1881 IS
1882 BEGIN
1883 IF g_mode IN (c_mode_tracer
1884 ,c_mode_jtracer
1885 ,c_mode_stracer) THEN
1886 print_pipe(convert_msg(p_msg));
1887 ELSIF g_mode = 'LOGFILE' THEN
1888 print_fndfile(convert_msg(p_msg));
1889 ELSIF g_mode IN ('AFLOG') THEN
1890 print_aflog(convert_msg(p_msg));
1891 ELSIF g_mode IN ('FILE') THEN
1892 print_file(convert_msg(p_msg));
1893 ELSIF g_mode IN ('OUTPUT') THEN
1894 print_output(convert_msg(p_msg));
1895 ELSIF g_mode IN ('HTML') THEN
1896 print_html(convert_msg(p_msg));
1897 ELSE
1898 --
1899 -- New mode probably, need to trace off before raising exception
1900 -- to prevent entering in an infinite loop
1901 --
1902 g_trace := 'N';
1903 xla_exceptions_pkg.raise_message ('XLA' , 'XLA_TRACE_INV_MODE'
1904 ,'MODE' , g_mode);
1905 END IF;
1906 END print;
1907
1908
1909
1910 /*======================================================================+
1911 | |
1912 | |
1913 | |
1914 | |
1915 | |
1916 | |
1917 | |
1918 | |
1919 | |
1920 | |
1921 | |
1922 | |
1923 | |
1924 | |
1925 | |
1926 | |
1927 | |
1928 | |
1929 | |
1930 | |
1931 | Statistics |
1932 | |
1933 | |
1934 | |
1935 | |
1936 | |
1937 | |
1938 | |
1939 | |
1940 | |
1941 | |
1942 | |
1943 | |
1944 | |
1945 | |
1946 | |
1947 | |
1948 | |
1949 | |
1950 | |
1951 | |
1952 +======================================================================*/
1953
1954
1955 /*======================================================================+
1956 | |
1957 | Public Procedure |
1958 | |
1959 | Activate_stat |
1960 | |
1961 | Activate the statistics. |
1962 | |
1963 +======================================================================*/
1964 PROCEDURE Activate_stat
1965 (p_debug_mode IN VARCHAR2
1966 ,p_location IN VARCHAR2)
1967
1968 IS
1969
1970 BEGIN
1971 IF NOT g_debug THEN
1972 g_dflt_profiler := 'Y';
1973
1974 activate
1975 (p_debug_mode => p_debug_mode
1976 ,p_location => p_location);
1977
1978 END IF;
1979 END Activate_stat;
1980
1981
1982 /*======================================================================+
1983 | |
1984 | Public Procedure |
1985 | |
1986 | DeActivate_stat |
1987 | |
1988 | De-Activate, if set, the XLA Statistics. |
1989 | |
1990 +======================================================================*/
1991 PROCEDURE Deactivate_stat
1992 (p_Location IN VARCHAR2 )
1993
1994 IS
1995
1996 BEGIN
1997 deactivate
1998 (p_location => p_location);
1999 END Deactivate_stat;
2000
2001
2002 /*======================================================================+
2003 | |
2004 | Public Procedure |
2005 | |
2006 | set_stat_on |
2007 | |
2008 | Switch the stat on. |
2009 | |
2010 +======================================================================*/
2011 PROCEDURE set_stat_on
2012
2013 IS
2014
2015 BEGIN
2016 IF g_profiler = 'Y' THEN
2017 xla_utility_profiler_pkg.start_profiler;
2018 END IF;
2019
2020 g_stat_datetime_start := dbms_utility.get_time;
2021
2022 g_stat := 'Y';
2023 END set_stat_on;
2024
2025
2026 /*======================================================================+
2027 | |
2028 | Public Procedure |
2029 | |
2030 | set_stat_off |
2031 | |
2032 | Switch the stat off. |
2033 | |
2034 +======================================================================*/
2035 PROCEDURE set_stat_off
2036
2037 IS
2038
2039 BEGIN
2040 IF g_stat = 'Y' THEN
2041 g_stat_datetime_stop := dbms_utility.get_time;
2042
2043 IF g_profiler = 'Y' THEN
2044 xla_utility_profiler_pkg.stop_profiler;
2045 END IF;
2046 g_stat := 'N';
2047 END IF;
2048 END set_stat_off;
2049
2050
2051
2052 /*======================================================================+
2053 | |
2054 | Public Function |
2055 | |
2056 | get_stat_info |
2057 | |
2058 | Return a statistic information |
2059 | |
2060 +======================================================================*/
2061 FUNCTION get_stat_info
2062 (p_option IN VARCHAR2)
2063 RETURN VARCHAR2
2064
2065 IS
2066
2067 BEGIN
2068 IF p_option = 'DURATION' THEN
2069 RETURN TO_CHAR(g_stat_datetime_stop
2070 - g_stat_datetime_start);
2071 ELSE
2072 xla_exceptions_pkg.raise_message
2073 ('XLA' ,'XLA_INTERNAL_ERROR'
2074 ,'ERROR' ,'Invalid option '||p_option
2075 ,'LOCATION' ,'xla_utility_pkg.set_option');
2076 END IF;
2077 END get_stat_info;
2078
2079
2080 /*======================================================================+
2081 | |
2082 | Public Procedure |
2083 | |
2084 | print_stat_info |
2085 | |
2086 | Print all information related to the stat to the std Trace output. |
2087 | |
2088 +======================================================================*/
2089 PROCEDURE print_stat_info
2090
2091 IS
2092
2093 BEGIN
2094 -- to be enhanced to support timing across days
2095 print(RPAD('+',76,'-')||'+');
2096 print(RPAD('Duration ',c_equal_position -1)
2097 || '= '
2098 ||
2099 TO_CHAR(g_stat_datetime_stop
2100 - g_stat_datetime_start));
2101 print(RPAD('+',76,'-')||'+');
2102
2103 IF g_profiler = 'Y' THEN
2104 g_format := 'N';
2105 xla_utility_profiler_pkg.dump_profiler_data;
2106 g_format := 'Y';
2107 END IF;
2108 END print_stat_info;
2109
2110
2111 /*======================================================================+
2112 | |
2113 | |
2114 | |
2115 | |
2116 | |
2117 | |
2118 | |
2119 | |
2120 | |
2121 | |
2122 | |
2123 | |
2124 | |
2125 | |
2126 | |
2127 | |
2128 | |
2129 | |
2130 | |
2131 | |
2132 | SQL_Trace |
2133 | |
2134 | |
2135 | |
2136 | |
2137 | |
2138 | |
2139 | |
2140 | |
2141 | |
2142 | |
2143 | |
2144 | |
2145 | |
2146 | |
2147 | |
2148 | |
2149 | |
2150 | |
2151 | |
2152 | |
2153 +======================================================================*/
2154
2155
2156 /*======================================================================+
2157 | |
2158 | Public Procedure |
2159 | |
2160 | init_sqltrace |
2161 | |
2162 | Alter the session to enter in sql_trace mode. |
2163 | |
2164 +======================================================================*/
2165 PROCEDURE set_sqltrace_on
2166
2167 IS
2168
2169 BEGIN
2170 IF g_sqltrace = 'Y' THEN
2171 dbms_session.set_sql_trace(TRUE);
2172 END IF;
2173 END;
2174
2175
2176 /*======================================================================+
2177 | |
2178 | Public Procedure |
2179 | |
2180 | sqltrace_off |
2181 | |
2182 | Alter the session to finish the sql trace mode. |
2183 | |
2184 +======================================================================*/
2185 PROCEDURE set_sqltrace_off
2186
2187 IS
2188
2189 BEGIN
2190 IF g_sqltrace = 'Y' THEN
2191 dbms_session.set_sql_trace(FALSE);
2192 END IF;
2193 END;
2194
2195
2196 /*======================================================================+
2197 | |
2198 | |
2199 | |
2200 | |
2201 | |
2202 | |
2203 | |
2204 | |
2205 | |
2206 | |
2207 | |
2208 | |
2209 | |
2210 | |
2211 | |
2212 | |
2213 | |
2214 | |
2215 | |
2216 | |
2217 | SRS log and output files utilities |
2218 | |
2219 | |
2220 | |
2221 | |
2222 | |
2223 | |
2224 | |
2225 | |
2226 | |
2227 | |
2228 | |
2229 | |
2230 | |
2231 | |
2232 | |
2233 | |
2234 | |
2235 | |
2236 | |
2237 | |
2238 +======================================================================*/
2239
2240
2241 /*======================================================================+
2242 | |
2243 | Public Procedure |
2244 | |
2245 | print_logfile |
2246 | |
2247 | Print the messgage to the fnd logfile |
2248 | |
2249 | Parameters |
2250 | 1 IN p_msg VARCHAR2 Debug message |
2251 | |
2252 +======================================================================*/
2253 PROCEDURE print_outputfile
2254 (p_msg IN VARCHAR2)
2255
2256 IS
2257
2258 BEGIN
2259 IF g_RequestId NOT IN (-1,0)
2260 AND g_srs_output_enable = 'Y' THEN
2261 fnd_file.put_line(fnd_file.output,p_msg);
2262 END IF;
2263 END print_outputfile;
2264
2265
2266 /*======================================================================+
2267 | |
2268 | Public Procedure |
2269 | |
2270 | print_logfile |
2271 | |
2272 | Print the messgage to the fnd output file |
2273 | |
2274 | Parameters |
2275 | 1 IN p_msg VARCHAR2 Debug message |
2276 | |
2277 +======================================================================*/
2278 PROCEDURE print_logfile (p_msg IN VARCHAR2)
2279 IS
2280
2281 BEGIN
2282 IF g_RequestId NOT IN (0,-1)
2283 AND g_srs_output_enable = 'Y' THEN
2284 fnd_file.put_line(fnd_file.log,p_msg);
2285 END IF;
2286 END print_logfile;
2287
2288
2289 /*======================================================================+
2290 | |
2291 | |
2292 | |
2293 | |
2294 | |
2295 | |
2296 | |
2297 | |
2298 | |
2299 | |
2300 | |
2301 | |
2302 | |
2303 | |
2304 | |
2305 | |
2306 | |
2307 | |
2308 | |
2309 | |
2310 | Reset |
2311 | |
2312 | |
2313 | |
2314 | |
2315 | |
2316 | |
2317 | |
2318 | |
2319 | |
2320 | |
2321 | |
2322 | |
2323 | |
2324 | |
2325 | |
2326 | |
2327 | |
2328 | |
2329 | |
2330 | |
2331 +======================================================================*/
2332
2333 /*======================================================================+
2334 | |
2335 | Private Procedure |
2336 | |
2337 | reset |
2338 | |
2339 | Reset the global variables. |
2340 | instanciated. |
2341 | |
2342 +======================================================================*/
2343 PROCEDURE reset
2344 IS
2345 BEGIN
2346 xla_environment_pkg.refresh;
2347 set_default_options;
2348 g_stat := 'N';
2349 END reset;
2350
2351
2352 BEGIN
2353 reset;
2354
2355 END xla_utility_pkg;
|
|
|