DBA Data[Home] [Help]

PACKAGE BODY: APPS.PO_LOG

Source


1 PACKAGE BODY PO_LOG AS
2 -- $Header: PO_LOG.plb 120.2.12020000.3 2013/02/11 00:35:42 vegajula ship $
3 
4 --
5 -- For more details on the PO logging strategy,
6 -- see the document at
7 -- /podev/po/internal/standards/logging/logging.xml
8 --
9 
10 /******************************************************************************
11  ******************************************************************************
12 
13 Quick example use reference
14 ---------------------------
15 
16 CREATE OR REPLACE PACKAGE BODY MY_PACKAGE AS
17 
18 D_PACKAGE_BASE CONSTANT VARCHAR2(50) := PO_LOG.get_package_base('MY_PACKAGE');
19 
20 D_my_proc CONSTANT VARCHAR2(100) :=
21   PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'my_proc');
22 
23 PROCEDURE my_proc(
24   p_in    IN PO_TBL_NUMBER
25 , p_inout IN OUT NOCOPY NUMBER
26 , p_out   OUT NOCOPY VARCHAR2
27 )
28 IS
29 d_mod CONSTANT VARCHAR2(100) := D_my_proc;
30 d_position NUMBER := 0;
31 BEGIN
32 
33 IF PO_LOG.d_proc THEN
34   PO_LOG.proc_begin(d_mod,'p_in',p_in);
35   PO_LOG.proc_begin(d_mod,'p_inout',p_inout);
36 END IF;
37 
38 d_position := 1;
39 
40 -- do some stuff...
41 
42 d_position := 123;
43 IF PO_LOG.d_stmt THEN
44   PO_LOG.stmt(d_mod,d_position,'did some stuff');
45 END IF;
46 
47 -- do some more stuff...
48 
49 IF PO_LOG.d_proc THEN
50   PO_LOG.proc_end(d_mod,'p_inout',p_inout);
51   PO_LOG.proc_end(d_mod,'p_out',p_out);
52 END IF;
53 
54 EXCEPTION
55 WHEN OTHERS THEN
56   IF PO_LOG.d_exc THEN
57     PO_LOG.exc(d_mod,d_position,NULL);
58   END IF;
59   RAISE;
60 
61 END my_proc;
62 
63 END MY_PACKAGE;
64 
65 
66 Summary of how to use the logging routines
67 ------------------------------------------
68 
69 All logging routines take a module_base.  The module base should
70 be derived through calls to get_package_base and get_subprogram_base.
71 These should be stored in CONSTANT package variables instead of
72 being derived directly in the procedure, as the cost of invoking
73 another procedure for each procedure invocation can be avoided.
74 
75 For the STATEMENT and PROCEDURE logging routines, signatures are provided
76 that take variable names and variable values.  These are convenient ways
77 to log several parameters or variables without having to concatenate
78 big log messages with name/value delimiters, converting variables into
79 strings, etc.
80 
81 Use of the different levels of logging statements should follow the
82 following guidelines:
83 
84 1-STATEMENT - PO_LOG.stmt()
85 
86   Use STATEMENT-level for general debugging messages within the body
87   of a method / procedure.
88 
89   Dynamic SQL must be recorded with STATEMENT-level logging, as well
90   as all bind variables that are used while executing the SQL.
91 
92 2-PROCEDURE - PO_LOG.proc_xxx()
93 
94   At the very beginning of every method/procedure, and immediately
95   before every exit point of the procedure (return statements, thrown
96   exceptions, normal "fall of the end"), PROCEDURE-level logs should
97   be written. PROCEDURE-level messages should also record all of the
98   input and output of a procedure.
99 
100   At the beginning of a procedure/function, proc_begin() should be
101   called for each IN or IN OUT parameter, or just for the module if it
102   has no such parameters.
103 
104   At the end of a procedure/function, proc_end()/proc_return() should be
105   called, again for each IN OUT or OUT parameter, return value, or just
106   for the module if it has none of these.  Be sure to call these routines
107   before each RETURN or normal RAISE statement in the procedure/function.
108 
109 3-EVENT - PO_LOG.event()
110 
111   At the beginning and end of a "flow", EVENT-level messages should be
112   logged. EVENT-level messages should be used at the beginning/end of
113   APIs, user-initiated actions (Form submits), concurrent requests,
114   workflows, and so on. EVENT-level logging should occur both before
115   and after calling another product's API. EVENT-level messages should
116   also be used to mark milestones within a larger flow, e.g. "document
117   locked", "validations completed", "document updated". EVENT-level
118   messages should surround all COMMITs, SAVEPOINTS, and ROLLBACKs.
119 
120 4-EXCEPTION - PO_LOG.exc()
121 
122   An EXCEPTION-level message should be logged any time an "exception"
123   occurs in the code. In PL/SQL, such a message should be logged at
124   the beginning of every (EXCEPTION) WHEN xxx THEN block unless the
125   exception is expected as part of the normal code flow, such as
126   NO_DATA_FOUND queries that are expected. If the PL/SQL exception is
127   expected, it should have a STATEMENT-level log message at the
128   beginning of the block instead of an EXCEPTION-level message.
129 
130   EXCEPTION-level messages should also be recorded if the code
131   encounters a condition that was not expected from a programming
132   perspective. This may include the default section of a switch
133   statement or the ELSE clause of a series of IF-ELSE IF
134   conditions. Furthermore, an EXCEPTION-level message should be logged
135   by any code that silently recovers from an unexpected
136   condition. Examples of this include fixing API parameters, like
137   setting the parameter to 'N' if it was NULL, or turning null into
138   the empty String "" to make code more robust.
139 
140   EXCEPTION-level messages can be monitored and used to improve an
141   application's performance and robustness.
142 
143  ******************************************************************************
144  ******************************************************************************
145  */
146 
147 /******************************************************************************
148 
149 Debug logging notes
150 (from Oracle Applications Logging Framework Guide, 8/21/03):
151 
152 ...
153 In some rare circumstances, for example, if you are debugging an
154 issue, you may need to manually initialize the PL/SQL layer logging
155 for the current session. From the SQL*Prompt, you could do this by
156 calling:
157 
158 FND_GLOBAL.APPS_INITIALIZE(fnd_user_id, fnd_resp_id, fnd_appl_id);
159 fnd_profile.put('AFLOG_ENABLED', 'Y');
160 fnd_profile.put('AFLOG_MODULE', '%');
161 fnd_profile.put('AFLOG_LEVEL','1');
162 fnd_profile.put('AFLOG_FILENAME', '');
163 fnd_log_repository.init;
164 
165 Do not ship any code with these calls! Shipping code that internally
166 hard codes Log Properties is a severe P1 bug.
167 ...
168 
169 -- Note:
170 -- The above calls do not modify the stored values in the database.
171 -- Instead, they update the cached runtime values.
172 
173 ...
174 Using Database Profile Options to Configure Logging
175 
176 To enable logging using database profile options, set the following
177 profile options at the desired profile option level:
178 
179 Profile Option Name     User Specified Name        Sample Value
180 AFLOG_ENABLED           FND: Debug Log Enabled     "Y"
181 AFLOG_MODULE            FND: Debug Log Module      "%"
182 AFLOG_LEVEL             FND: Debug Log Level       "ERROR"
183 AFLOG_FILENAME          FND: Debug Log Filename    "/path/to/apps.log"
184 
185 
186 ******************************************************************************
187 
188 Debugging example:
189 
190 This method was used to debug PO_DOCUMENT_FUNDS_PVT.do_unreserve.
191 
192 The following code was executed:
193 
194 
195 DECLARE
196 l_return_status VARCHAR2(2000);
197 l_po_return_code VARCHAR2(2000);
198 l_online_report_id NUMBER;
199 
200 d_mod VARCHAR2(100);
201 
202 BEGIN
203 
204 FND_GLOBAL.APPS_INITIALIZE(1318, 50063, 201);  -- operations, vision services, purchasing
205 
206 PO_LOG.enable_logging('po.plsql.SBULL%,po.plsql.%ENCUMBRANCE%,po.plsql.PO_DOCUMENT_FUNDS%');
207 
208 d_mod := PO_LOG.get_subprogram_base(PO_LOG.get_package_base('SBULL'),'TEST');
209 
210 PO_LOG.proc_begin(d_mod);
211 
212 PO_DOCUMENT_FUNDS_PVT.do_unreserve(
213    x_return_status      => l_return_status
214 ,  p_doc_type           => PO_DOCUMENT_FUNDS_PVT.g_doc_type_PO
215 ,  p_doc_subtype        => PO_DOCUMENT_FUNDS_PVT.g_doc_subtype_STANDARD
216 ,  p_doc_level          => PO_DOCUMENT_FUNDS_PVT.g_doc_level_HEADER
217 ,  p_doc_level_id       => 20604
218 ,  p_use_enc_gt_flag    => PO_DOCUMENT_FUNDS_PVT.g_parameter_NO
219 ,  p_validate_document  => PO_DOCUMENT_FUNDS_PVT.g_parameter_YES
220 ,  p_override_funds     => PO_DOCUMENT_FUNDS_PVT.g_parameter_USE_PROFILE
221 ,  p_use_gl_date        => PO_DOCUMENT_FUNDS_PVT.g_parameter_USE_PROFILE
222 ,  p_override_date      => SYSDATE
223 ,  p_employee_id        => NULL
224 ,  x_po_return_code     => l_po_return_code
225 ,  x_online_report_id   => l_online_report_id
226 );
227 
228 PO_LOG.proc_end(d_mod);
229 
230 END;
231 
232 
233 After the code was executed, the messages were inspected like so:
234 
235 select module,message_text,timestamp, log_sequence
236 from fnd_log_messages
237 where log_sequence
238    between
239       (  select max(log_sequence)
240          from fnd_log_messages
241          where module = 'po.plsql.SBULL.TEST.BEGIN'
242       )
243    and
244       (  select max(log_sequence)
245          from fnd_log_messages
246          where module = 'po.plsql.SBULL.TEST.END'
247       )
248 order by log_sequence
249 ;
250 
251 ******************************************************************************/
252 
253 
254 
255 ---------------------------------------------------------------------------
256 -- CONSTANTS
257 ---------------------------------------------------------------------------
258 
259 -- Used to separate tokens in the module string.
260 D_MODULE_SEPARATOR CONSTANT VARCHAR2(1) := '.';
261 
262 -- Contains the string that must prefix all
263 -- module names in log messages from PO PL/SQL procedures.
264 D_MODULE_PREFIX CONSTANT VARCHAR2(9) := 'po.plsql.';
265 
266 -- Used in the message text of an array's count.
267 D_COUNT CONSTANT VARCHAR2(6) := '.COUNT';
268 
269 -- Used in the message text of array elements.
270 L_PAREN CONSTANT VARCHAR2(1) := '(';
271 
272 -- Used in the message text of array elements.
273 R_PAREN CONSTANT VARCHAR2(1) := ')';
274 
275 -- Used in the module of procedure messages.
276 D_BEGIN CONSTANT VARCHAR2(5) := 'BEGIN';
277 
278 -- Used in the module of procedure messages.
279 D_END CONSTANT VARCHAR2(3) := 'END';
280 
281 -- Used in the module of procedure messages.
282 D_RETURN CONSTANT VARCHAR2(6) := 'RETURN';
283 
284 -- Used in the module of procedure messages.
285 D_RAISE CONSTANT VARCHAR2(5) := 'RAISE';
286 
287 -- Used in the text of procedure messages.
288 D_START_OF_SUBPROGRAM CONSTANT VARCHAR2(20) := 'Start of subprogram.';
289 
290 -- Used in the text of procedure messages.
291 D_END_OF_SUBPROGRAM CONSTANT VARCHAR2(18) := 'End of subprogram.';
292 
293 -- Used in the text of procedure messages.
294 D_RETURN_VALUE CONSTANT VARCHAR2(12) := 'Return value';
295 
296 
297 ---------------------------------------------------------------------------
298 -- Modules for debugging.
299 ---------------------------------------------------------------------------
300 
301 -- The module base for this package.
302 D_PACKAGE_BASE CONSTANT VARCHAR2(50) := get_package_base('PO_LOG');
303 
304 -- The module base for the subprogram.
305 D_MOD_refresh_log_flags CONSTANT VARCHAR2(100) :=
306   get_subprogram_base(D_PACKAGE_BASE,'refresh_log_flags');
307 
308 
309 ---------------------------------------------------------------------------
310 -- PROCEDURES AND FUNCTIONS
311 ---------------------------------------------------------------------------
312 
313 
314 -------------------------------------------------------------------------------
315 --Start of Comments
316 --Pre-reqs: None.
317 --Modifies: The AFLOG_xxx profile options and variables in this package.
318 --Locks: None.
319 --Function:
320 --
321 --  *** DO NOT USE IN PRODUCTION CODE! ***
322 --
323 --  This procedure updates the FND Logging profile options and the cached
324 --  values in this package to enable logging for the current responsibility
325 --  for the session.
326 --
327 --  This should only be used while trying to debug a problem, as a
328 --  substitute for setting the FND profile options.
329 --
330 --Parameters:
331 --IN:
332 --p_module
333 --  A comma-separated list of module criteria
334 --  for which logging should be enabled.
335 --  Example: 'po.plsql.PO_DOCUMENT_FUNDS%,po.plsql.PO_ENCUMBRANCE%'
336 --p_level
337 --  The lowest level for which logging should be enabled.
338 --  Use the following values:
339 --    1 - STATEMENT
340 --    2 - PROCEDURE
341 --    3 - EVENT
342 --    4 - EXCEPTION
343 --    5 - ERROR
344 --    6 - UNEXPECTED
345 --End of Comments
346 -------------------------------------------------------------------------------
347 PROCEDURE enable_logging(
348   p_module  IN VARCHAR2 DEFAULT 'p'||'o.%' -- GSCC File.Sql.6
349 , p_level   IN NUMBER DEFAULT 1
350 )
351 IS
352 BEGIN
353 
354 -- Set the FND profile option values.
355 FND_PROFILE.put('AFLOG_ENABLED','Y');
356 FND_PROFILE.put('AFLOG_MODULE',p_module);
357 FND_PROFILE.put('AFLOG_LEVEL',TO_CHAR(p_level));
358 FND_PROFILE.put('AFLOG_FILENAME','');
359 
360 -- Refresh the FND cache.
361 FND_LOG_REPOSITORY.init();
362 
363 -- Refresh the PO cache.
364 refresh_log_flags();
365 
366 END enable_logging;
367 
368 
369 -------------------------------------------------------------------------------
370 --Start of Comments
371 --Pre-reqs: None.
372 --Modifies: The d_xxx public package variables.
373 --Locks: None.
374 --Function:
375 --  Updates the d_xxx variables with indicators of whether or not
376 --  logging is enabled at the particular level.
377 --
378 --  This procedure should be called whenever the Apps context changes,
379 --  as the determination of whether or not logging is enabled depends
380 --  on profile values that can change with different responsibilities.
381 --  This can be accomplished by adding a hook into
382 --  FND_GLOBAL.APPS_INITIALIZE via the FND_PRODUCT_INITIALIZATION table.
383 --
384 --  This procedure will also be called during package intialization.
385 --
386 --End of Comments
387 -------------------------------------------------------------------------------
388 PROCEDURE refresh_log_flags
389 IS
390 l_current_log_level NUMBER;
391 BEGIN
392 
393 IF (FND_PROFILE.VALUE('AFLOG_ENABLED') = 'Y') THEN
394   l_current_log_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
395   d_stmt := (l_current_log_level <= FND_LOG.LEVEL_STATEMENT);
396   d_proc := (l_current_log_level <= FND_LOG.LEVEL_PROCEDURE);
397   d_event := (l_current_log_level <= FND_LOG.LEVEL_EVENT);
398   d_exc := (l_current_log_level <= FND_LOG.LEVEL_EXCEPTION);
399   d_error := (l_current_log_level <= FND_LOG.LEVEL_ERROR);
400   d_unexp := (l_current_log_level <= FND_LOG.LEVEL_UNEXPECTED);
401 ELSE
402   d_stmt := FALSE;
403   d_proc := FALSE;
404   d_event := FALSE;
405   d_exc := FALSE;
406   d_error := FALSE;
407   d_unexp := FALSE;
408 END IF;
409 
410 IF d_proc THEN
411   proc_end(D_MOD_refresh_log_flags);
412 END IF;
413 
414 EXCEPTION
415 WHEN OTHERS THEN
416   NULL;
417 
418 END refresh_log_flags;
419 
420 
421 -------------------------------------------------------------------------------
422 --Start of Comments
423 --Pre-reqs: None.
424 --Modifies: None.
425 --Locks: None.
426 --Function:
427 --  Appends the package name to the PL/SQL base module and adds
428 --  module separators.
429 --Parameters:
430 --IN:
431 --p_package_name The name of the package, for example, "PO_LOG".
432 --Returns:
433 --  A string appropriate for passing into get_subprogram_base().
434 --  VARCHAR2(50).
435 --End of Comments
436 -------------------------------------------------------------------------------
437 FUNCTION get_package_base(
438   p_package_name                  IN  VARCHAR2
439 )
440 RETURN VARCHAR2
441 IS
442 BEGIN
443 RETURN D_MODULE_PREFIX || UPPER(p_package_name) || D_MODULE_SEPARATOR;
444 END get_package_base;
445 
446 
447 -------------------------------------------------------------------------------
448 --Start of Comments
449 --Pre-reqs: None.
450 --Modifies: None.
451 --Locks: None.
452 --Function:
453 --  Appends the subprogram name to the package base and adds
454 --  module separators.
455 --Parameters:
456 --IN:
457 --p_package_base The module string up to the package name, as returned
458 --  by get_package_base().
459 --p_subprogram_name The name of the subprogram,
460 --  for example, "get_subprogram_base".
464 --  VARCHAR2(100).
461 --Returns:
462 --  A string appropriate for use in any of the logging routines requiring
463 --  the module base.
465 --End of Comments
466 -------------------------------------------------------------------------------
467 FUNCTION get_subprogram_base(
468   p_package_base                  IN  VARCHAR2
469 , p_subprogram_name               IN  VARCHAR2
470 )
471 RETURN VARCHAR2
472 IS
473 BEGIN
474 RETURN p_package_base || UPPER(p_subprogram_name) || D_MODULE_SEPARATOR;
475 END get_subprogram_base;
476 
477 
478 
479 -------------------------------------------------------------------------------
480 -- Generic logging routines.
481 -------------------------------------------------------------------------------
482 
483 PROCEDURE log(
484   p_log_level     IN NUMBER
485 , p_module_base   IN VARCHAR2
486 , p_module_suffix IN VARCHAR2
487 , p_message_text  IN VARCHAR2
488 )
489 IS
490 BEGIN
491 IF (p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
492   FND_LOG.string(p_log_level,p_module_base||p_module_suffix,p_message_text);
493 END IF;
494 EXCEPTION
495 WHEN OTHERS THEN
496   NULL;
497 END log;
498 
499 
500 FUNCTION var_to_string(
501   p_variable_name   IN VARCHAR2
502 , p_variable_value  IN VARCHAR2
503 )
504 RETURN VARCHAR2
505 IS
506 BEGIN
507 IF (p_variable_value IS NULL) THEN
508   RETURN p_variable_name || ' is null';
509 ELSE
510   RETURN p_variable_name || ' = ' || p_variable_value;
511 END IF;
512 END var_to_string;
513 
514 
515 FUNCTION var_to_string(
516   p_variable_name   IN VARCHAR2
517 , p_variable_value  IN NUMBER
518 )
519 RETURN VARCHAR2
520 IS
521 BEGIN
522 RETURN var_to_string(p_variable_name,TO_CHAR(p_variable_value));
523 END var_to_string;
524 
525 
526 FUNCTION var_to_string(
527   p_variable_name   IN VARCHAR2
528 , p_variable_value  IN DATE
529 )
530 RETURN VARCHAR2
531 IS
532 BEGIN
533 RETURN var_to_string(p_variable_name,
534         TO_CHAR(p_variable_value,'DD-MON-RRRR HH:MI:SSAM'));
535 END var_to_string;
536 
537 
538 FUNCTION var_to_string(
539   p_variable_name   IN VARCHAR2
540 , p_variable_value  IN BOOLEAN
541 )
542 RETURN VARCHAR2
543 IS
544 l_varchar_value VARCHAR2(5);
545 BEGIN
546 IF (p_variable_value IS NULL) THEN
547   l_varchar_value := TO_CHAR(NULL);
548 ELSIF p_variable_value THEN
549   l_varchar_value := 'TRUE';
550 ELSE
551   l_varchar_value := 'FALSE';
552 END IF;
553 RETURN var_to_string(p_variable_name,l_varchar_value);
554 END var_to_string;
555 
556 
557 PROCEDURE decode_level_suffix(
558   x_log_level     IN OUT NOCOPY NUMBER
559 , x_module_suffix IN OUT NOCOPY VARCHAR2
560 )
561 IS
562 BEGIN
563 IF (x_log_level IN (c_PROC_BEGIN,c_PROC_END,c_PROC_RETURN,c_PROC_RAISE)) THEN
564   x_module_suffix :=
565     CASE x_log_level
566     WHEN c_PROC_BEGIN THEN D_BEGIN||D_MODULE_SEPARATOR||x_module_suffix
567     WHEN c_PROC_END THEN D_END||D_MODULE_SEPARATOR||x_module_suffix
568     WHEN c_PROC_RETURN THEN D_RETURN||D_MODULE_SEPARATOR||x_module_suffix
569     WHEN c_PROC_RAISE THEN D_RAISE||D_MODULE_SEPARATOR||x_module_suffix
570     ELSE x_module_suffix
571     END;
572   x_log_level := FND_LOG.LEVEL_PROCEDURE;
573 END IF;
574 END decode_level_suffix;
575 
576 ----------------------------------------------------------------------
577 -- This routine can be used for any logging level,
578 -- so that different procedures do not need to be
579 -- created for each kind of logging
580 -- (stmt/proc_begin/proc_end/proc_return/...).
581 -- @param p_log_level Use one of the package constants:
582 --    c_STMT, c_PROC_BEGIN, c_PROC_END, c_PROC_RETURN, etc.
583 ----------------------------------------------------------------------
584 PROCEDURE log(
585   p_log_level       IN NUMBER
586 , p_module_base     IN VARCHAR2
587 , p_module_suffix   IN VARCHAR2
588 , p_variable_name   IN VARCHAR2
589 , p_variable_value  IN PO_VALIDATION_RESULTS_TYPE
590 )
591 IS
592 l_log_level NUMBER;
593 l_module_suffix VARCHAR2(4000);
594 BEGIN
595 l_log_level := p_log_level;
596 l_module_suffix := p_module_suffix;
597 decode_level_suffix(l_log_level,l_module_suffix);
598 IF (p_variable_value IS NULL) THEN
599   log(l_log_level,p_module_base,l_module_suffix,
600     var_to_string(p_variable_name,TO_CHAR(NULL)));
601 ELSE
602   log(l_log_level,p_module_base,l_module_suffix,
603     var_to_string(p_variable_name||D_COUNT,p_variable_value.result_type.COUNT));
604 END IF;
605 EXCEPTION
606 WHEN OTHERS THEN
607   NULL;
608 END log;
609 
610 
611 PROCEDURE log(
612   p_log_level       IN NUMBER
613 , p_module_base     IN VARCHAR2
614 , p_module_suffix   IN VARCHAR2
615 , p_variable_name   IN VARCHAR2
616 , p_variable_value  IN PO_TBL_NUMBER
617 )
618 IS
619 BEGIN
620 IF (p_variable_value IS NULL) THEN
621   log(p_log_level,p_module_base,p_module_suffix,
622     var_to_string(p_variable_name,TO_CHAR(NULL)));
623 ELSE
624   log(p_log_level,p_module_base,p_module_suffix,
625     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
626   FOR i IN 1 .. p_variable_value.COUNT LOOP
627     log(p_log_level,p_module_base,p_module_suffix,
628       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
629         p_variable_value(i)));
630   END LOOP;
631 END IF;
632 EXCEPTION
633 WHEN OTHERS THEN
634   NULL;
635 END log;
636 
637 
638 PROCEDURE log(
642 , p_variable_name   IN VARCHAR2
639   p_log_level       IN NUMBER
640 , p_module_base     IN VARCHAR2
641 , p_module_suffix   IN VARCHAR2
643 , p_variable_value  IN PO_TBL_DATE
644 )
645 IS
646 BEGIN
647 IF (p_variable_value IS NULL) THEN
648   log(p_log_level,p_module_base,p_module_suffix,
649     var_to_string(p_variable_name,TO_CHAR(NULL)));
650 ELSE
651   log(p_log_level,p_module_base,p_module_suffix,
652     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
653   FOR i IN 1 .. p_variable_value.COUNT LOOP
654     log(p_log_level,p_module_base,p_module_suffix,
655       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
656         p_variable_value(i)));
657   END LOOP;
658 END IF;
659 EXCEPTION
660 WHEN OTHERS THEN
661   NULL;
662 END log;
663 
664 
665 PROCEDURE log(
666   p_log_level       IN NUMBER
667 , p_module_base     IN VARCHAR2
668 , p_module_suffix   IN VARCHAR2
669 , p_variable_name   IN VARCHAR2
670 , p_variable_value  IN PO_TBL_VARCHAR1
671 )
672 IS
673 BEGIN
674 IF (p_variable_value IS NULL) THEN
675   log(p_log_level,p_module_base,p_module_suffix,
676     var_to_string(p_variable_name,TO_CHAR(NULL)));
677 ELSE
678   log(p_log_level,p_module_base,p_module_suffix,
679     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
680   FOR i IN 1 .. p_variable_value.COUNT LOOP
681     log(p_log_level,p_module_base,p_module_suffix,
682       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
683         p_variable_value(i)));
684   END LOOP;
685 END IF;
686 EXCEPTION
687 WHEN OTHERS THEN
688   NULL;
689 END log;
690 
691 
692 PROCEDURE log(
693   p_log_level       IN NUMBER
694 , p_module_base     IN VARCHAR2
695 , p_module_suffix   IN VARCHAR2
696 , p_variable_name   IN VARCHAR2
697 , p_variable_value  IN PO_TBL_VARCHAR5
698 )
699 IS
700 BEGIN
701 IF (p_variable_value IS NULL) THEN
702   log(p_log_level,p_module_base,p_module_suffix,
703     var_to_string(p_variable_name,TO_CHAR(NULL)));
704 ELSE
705   log(p_log_level,p_module_base,p_module_suffix,
706     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
707   FOR i IN 1 .. p_variable_value.COUNT LOOP
708     log(p_log_level,p_module_base,p_module_suffix,
709       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
710         p_variable_value(i)));
711   END LOOP;
712 END IF;
713 EXCEPTION
714 WHEN OTHERS THEN
715   NULL;
716 END log;
717 
718 
719 PROCEDURE log(
720   p_log_level       IN NUMBER
721 , p_module_base     IN VARCHAR2
722 , p_module_suffix   IN VARCHAR2
723 , p_variable_name   IN VARCHAR2
724 , p_variable_value  IN PO_TBL_VARCHAR30
725 )
726 IS
727 BEGIN
728 IF (p_variable_value IS NULL) THEN
729   log(p_log_level,p_module_base,p_module_suffix,
730     var_to_string(p_variable_name,TO_CHAR(NULL)));
731 ELSE
732   log(p_log_level,p_module_base,p_module_suffix,
733     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
734   FOR i IN 1 .. p_variable_value.COUNT LOOP
735     log(p_log_level,p_module_base,p_module_suffix,
736       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
737         p_variable_value(i)));
738   END LOOP;
739 END IF;
740 EXCEPTION
741 WHEN OTHERS THEN
742   NULL;
743 END log;
744 
745 
746 PROCEDURE log(
747   p_log_level       IN NUMBER
748 , p_module_base     IN VARCHAR2
749 , p_module_suffix   IN VARCHAR2
750 , p_variable_name   IN VARCHAR2
751 , p_variable_value  IN PO_TBL_VARCHAR100
752 )
753 IS
754 BEGIN
755 IF (p_variable_value IS NULL) THEN
756   log(p_log_level,p_module_base,p_module_suffix,
757     var_to_string(p_variable_name,TO_CHAR(NULL)));
758 ELSE
759   log(p_log_level,p_module_base,p_module_suffix,
760     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
761   FOR i IN 1 .. p_variable_value.COUNT LOOP
762     log(p_log_level,p_module_base,p_module_suffix,
763       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
764         p_variable_value(i)));
765   END LOOP;
766 END IF;
767 EXCEPTION
768 WHEN OTHERS THEN
769   NULL;
770 END log;
771 
772 
773 PROCEDURE log(
774   p_log_level       IN NUMBER
775 , p_module_base     IN VARCHAR2
776 , p_module_suffix   IN VARCHAR2
777 , p_variable_name   IN VARCHAR2
778 , p_variable_value  IN PO_TBL_VARCHAR2000
779 )
780 IS
781 BEGIN
782 IF (p_variable_value IS NULL) THEN
783   log(p_log_level,p_module_base,p_module_suffix,
784     var_to_string(p_variable_name,TO_CHAR(NULL)));
785 ELSE
786   log(p_log_level,p_module_base,p_module_suffix,
787     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
788   FOR i IN 1 .. p_variable_value.COUNT LOOP
789     log(p_log_level,p_module_base,p_module_suffix,
790       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
791         p_variable_value(i)));
792   END LOOP;
793 END IF;
794 EXCEPTION
795 WHEN OTHERS THEN
796   NULL;
797 END log;
798 
799 
800 PROCEDURE log(
801   p_log_level       IN NUMBER
802 , p_module_base     IN VARCHAR2
803 , p_module_suffix   IN VARCHAR2
804 , p_variable_name   IN VARCHAR2
805 , p_variable_value  IN PO_TBL_VARCHAR4000
806 )
807 IS
808 BEGIN
809 IF (p_variable_value IS NULL) THEN
810   log(p_log_level,p_module_base,p_module_suffix,
811     var_to_string(p_variable_name,TO_CHAR(NULL)));
812 ELSE
813   log(p_log_level,p_module_base,p_module_suffix,
817       var_to_string(p_variable_name||L_PAREN||TO_CHAR(i)||R_PAREN,
814     var_to_string(p_variable_name||D_COUNT,p_variable_value.COUNT));
815   FOR i IN 1 .. p_variable_value.COUNT LOOP
816     log(p_log_level,p_module_base,p_module_suffix,
818         p_variable_value(i)));
819   END LOOP;
820 END IF;
821 EXCEPTION
822 WHEN OTHERS THEN
823   NULL;
824 END log;
825 
826 
827 
828 -------------------------------------------------------------------------------
829 -- STATEMENT-level logging.
830 -------------------------------------------------------------------------------
831 
832 PROCEDURE stmt(
833   p_module_base                   IN  VARCHAR2
834 , p_position                      IN  NUMBER
835 , p_message_text                  IN  VARCHAR2  DEFAULT NULL
836 )
837 IS
838 BEGIN
839 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),p_message_text);
840 END stmt;
841 
842 PROCEDURE stmt(
843   p_module_base                   IN  VARCHAR2
844 , p_position                      IN  NUMBER
845 , p_variable_name                 IN  VARCHAR2
846 , p_variable_value                IN  VARCHAR2
847 )
848 IS
849 BEGIN
850 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
851   var_to_string(p_variable_name,p_variable_value));
852 END stmt;
853 
854 PROCEDURE stmt(
855   p_module_base                   IN  VARCHAR2
856 , p_position                      IN  NUMBER
857 , p_variable_name                 IN  VARCHAR2
858 , p_variable_value                IN  NUMBER
859 )
860 IS
861 BEGIN
862 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
863   var_to_string(p_variable_name,p_variable_value));
864 END stmt;
865 
866 PROCEDURE stmt(
867   p_module_base                   IN  VARCHAR2
868 , p_position                      IN  NUMBER
869 , p_variable_name                 IN  VARCHAR2
870 , p_variable_value                IN  DATE
871 )
872 IS
873 BEGIN
874 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
875   var_to_string(p_variable_name,p_variable_value));
876 END stmt;
877 
878 PROCEDURE stmt(
879   p_module_base                   IN  VARCHAR2
880 , p_position                      IN  NUMBER
881 , p_variable_name                 IN  VARCHAR2
882 , p_variable_value                IN  BOOLEAN
883 )
884 IS
885 BEGIN
886 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
887   var_to_string(p_variable_name,p_variable_value));
888 END stmt;
889 
890 PROCEDURE stmt(
891   p_module_base                   IN  VARCHAR2
892 , p_position                      IN  NUMBER
893 , p_variable_name                 IN  VARCHAR2
894 , p_variable_value                IN  PO_TBL_NUMBER
895 )
896 IS
897 BEGIN
898 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
899   p_variable_name,p_variable_value);
900 END stmt;
901 
902 PROCEDURE stmt(
903   p_module_base                   IN  VARCHAR2
904 , p_position                      IN  NUMBER
905 , p_variable_name                 IN  VARCHAR2
906 , p_variable_value                IN  PO_TBL_DATE
907 )
908 IS
909 BEGIN
910 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
911   p_variable_name,p_variable_value);
912 END stmt;
913 
914 PROCEDURE stmt(
915   p_module_base                   IN  VARCHAR2
916 , p_position                      IN  NUMBER
917 , p_variable_name                 IN  VARCHAR2
918 , p_variable_value                IN  PO_TBL_VARCHAR1
919 )
920 IS
921 BEGIN
922 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
923   p_variable_name,p_variable_value);
924 END stmt;
925 
926 PROCEDURE stmt(
927   p_module_base                   IN  VARCHAR2
928 , p_position                      IN  NUMBER
929 , p_variable_name                 IN  VARCHAR2
930 , p_variable_value                IN  PO_TBL_VARCHAR5
931 )
932 IS
933 BEGIN
934 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
935   p_variable_name,p_variable_value);
936 END stmt;
937 
938 PROCEDURE stmt(
939   p_module_base                   IN  VARCHAR2
940 , p_position                      IN  NUMBER
941 , p_variable_name                 IN  VARCHAR2
942 , p_variable_value                IN  PO_TBL_VARCHAR30
943 )
944 IS
945 BEGIN
946 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
947   p_variable_name,p_variable_value);
948 END stmt;
949 
950 PROCEDURE stmt(
951   p_module_base                   IN  VARCHAR2
952 , p_position                      IN  NUMBER
953 , p_variable_name                 IN  VARCHAR2
954 , p_variable_value                IN  PO_TBL_VARCHAR100
955 )
956 IS
957 BEGIN
958 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
959   p_variable_name,p_variable_value);
960 END stmt;
961 
962 PROCEDURE stmt(
963   p_module_base                   IN  VARCHAR2
964 , p_position                      IN  NUMBER
965 , p_variable_name                 IN  VARCHAR2
966 , p_variable_value                IN  PO_TBL_VARCHAR2000
967 )
968 IS
969 BEGIN
970 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
971   p_variable_name,p_variable_value);
972 END stmt;
973 
974 PROCEDURE stmt(
975   p_module_base                   IN  VARCHAR2
976 , p_position                      IN  NUMBER
977 , p_variable_name                 IN  VARCHAR2
978 , p_variable_value                IN  PO_TBL_VARCHAR4000
979 )
980 IS
981 BEGIN
982 log(FND_LOG.LEVEL_STATEMENT,p_module_base,TO_CHAR(p_position),
986 -------------------------------------------------------------------------------
983   p_variable_name,p_variable_value);
984 END stmt;
985 
987 --Start of Comments
988 --Pre-reqs: None.
989 --Modifies: FND_LOG_MESSAGES
990 --Locks: None.
991 --Function:
992 --  Logs STATEMENT-level messages containing data from PO_SESSION_GT.
993 --Parameters:
994 --IN:
995 --p_module_base
996 --  The log module base as obtained from get_subprogram_base().
997 --p_position
998 --  A location indicator for the calling subprogram.
999 --p_key
1000 --  Indicates which rows from PO_SESSION_GT to report.
1001 --  All rows WHERE PO_SESSION_GT.key = p_key will be reported.
1002 --p_column_name_tbl
1003 --  The column names whose values for the specified rows should be reported.
1004 --  If all column values should be reported, use NULL.
1005 --End of Comments
1006 -------------------------------------------------------------------------------
1007 PROCEDURE stmt_session_gt(
1008   p_module_base                   IN  VARCHAR2
1009 , p_position                      IN  NUMBER
1010 , p_key                           IN  NUMBER
1011 , p_column_name_tbl               IN  PO_TBL_VARCHAR30    DEFAULT NULL
1012 )
1013 IS
1014 l_rowid_tbl PO_TBL_VARCHAR2000;
1015 BEGIN
1016 
1017 IF d_stmt THEN
1018 
1019   SELECT rowid
1020   BULK COLLECT INTO l_rowid_tbl
1021   FROM PO_SESSION_GT
1022   WHERE key = p_key
1023   ;
1024 
1025   stmt_table(
1026     p_module_base     => p_module_base
1027   , p_position        => p_position
1028   , p_table_name      => 'PO_SESSION_GT'
1029   , p_rowid_tbl       => l_rowid_tbl
1030   , p_column_name_tbl => p_column_name_tbl
1031   );
1032 
1033 END IF;
1034 
1035 EXCEPTION
1036 WHEN OTHERS THEN
1037   NULL;
1038 END stmt_session_gt;
1039 
1040 PROCEDURE stmt_all_session_gt(
1041   p_module_base                   IN  VARCHAR2
1042 , p_position                      IN  NUMBER
1043 , p_record_identifier             IN  VARCHAR2
1044 )
1045 IS
1046 update_po_log_tbl po_tbl_number;
1047 BEGIN
1048 
1049 update_po_log_tbl:=po_tbl_number();
1050 
1051 SELECT psgt.key
1052 BULK COLLECT INTO update_po_log_tbl
1053 FROM po_session_gt psgt
1054 WHERE psgt.index_char1=p_record_identifier ;
1055 
1056 
1057 FOR i in 1..update_po_log_tbl.COUNT LOOP
1058 stmt_session_gt( p_module_base  => p_module_base,
1059                  p_position     => p_position ,
1060                  p_key          => update_po_log_tbl(i));
1061 END LOOP;
1062 
1063 END stmt_all_session_gt;
1064 
1065 
1066 -------------------------------------------------------------------------------
1067 --Start of Comments
1068 --Pre-reqs: None.
1069 --Modifies: FND_LOG_MESSAGES
1070 --Locks: None.
1071 --Function:
1072 --  Logs STATEMENT-level messages containing data from the specified table.
1073 --Parameters:
1074 --IN:
1075 --p_module_base
1076 --  The log module base as obtained from get_subprogram_base().
1077 --p_position
1078 --  A location indicator for the calling subprogram.
1079 --p_table_name
1080 --  The name of the table about which to report.
1081 --p_rowid_tbl
1082 --  The rowids of the table about which to report.
1083 --  To report all rows in the table, use c_all_rows.
1084 --p_column_name_tbl
1085 --  The column names whose values for the specified rows should be reported.
1086 --  If all column values should be reported, use NULL.
1087 --End of Comments
1088 -------------------------------------------------------------------------------
1089 PROCEDURE stmt_table(
1090   p_module_base                   IN  VARCHAR2
1091 , p_position                      IN  NUMBER
1092 , p_table_name                    IN  VARCHAR2
1093 , p_rowid_tbl                     IN  PO_TBL_VARCHAR2000
1094 , p_column_name_tbl               IN  PO_TBL_VARCHAR30    DEFAULT NULL
1095 )
1096 IS
1097 
1098 TYPE t_tbl_data_type    IS TABLE OF ALL_TAB_COLUMNS.column_name%TYPE;
1099 TYPE t_tbl_varchar      IS TABLE OF VARCHAR2(4000);
1100 TYPE t_ref_csr          IS REF CURSOR;
1101 
1102 l_column_name_tbl    po_tbl_varchar30;
1103 l_data_type_tbl      t_tbl_data_type;
1104 
1105 l_printable_column_tbl  po_tbl_varchar30;
1106 
1107 l_value_rowid_tbl    po_tbl_varchar2000;
1108 l_value_tbl          t_tbl_varchar;
1109 
1110 l_sql    VARCHAR2(32767);
1111 l_char   VARCHAR2(4000);
1112 
1113 l_col_i  PLS_INTEGER;
1114 
1115 l_table_name   VARCHAR2(30);
1116 l_table_owner  VARCHAR2(30);
1117 l_print_column_flag  BOOLEAN;
1118 
1119 l_log_head     VARCHAR2(2000);
1120 
1121 l_rowid_tbl    po_tbl_varchar2000;
1122 l_rowid_csr    t_ref_csr;
1123 /*Bug 12326054*/
1124 l_status VARCHAR2(1);
1125 l_industry VARCHAR2(1);
1126 l_return_status BOOLEAN;
1127 
1128 BEGIN
1129 -- TODO: Refactor this procedure.
1130 -- It was copied from the PO_DEBUG.debug_table implementation,
1131 -- and needs to be reworked a bit.
1132 --
1133 -- Ideas for refactoring:
1134 -- Get the current schema via SYS_CONTEXT('USERENV','CURRENT_SCHEMA').
1135 -- Use all_synonyms to find the base table / view.
1136 -- (maybe just use user_synonyms, if login is always APPS, regardless of current_schema)
1137 -- Use all_tab_columns to get column names.
1138 --
1139 
1140 IF d_stmt THEN
1141 
1142    l_printable_column_tbl := po_tbl_varchar30();
1143    l_value_rowid_tbl := po_tbl_varchar2000();
1144    l_value_tbl := t_tbl_varchar();
1145 
1146    l_table_name := UPPER(p_table_name);
1147 
1148    /*Bug 12326054 : Commented out hard coding owner as PO.
1149    Instead get the table owner from FND_INSTALLATION.get_app_info*/
1150   -- l_table_owner := 'PO';
1154                          l_status,
1151   -- Use the refactoring ideas to get the real value for table_owner.
1152   l_return_status :=   FND_INSTALLATION.get_app_info
1153                        ( 'PO',
1155                          l_industry,
1156                          l_table_owner
1157                        );
1158 
1159 
1160   l_log_head := p_module_base||TO_CHAR(p_position)|| '.DEBUG_TABLE.' || p_table_name||'.';
1161 
1162   stmt(l_log_head||'START',NULL,'Logging non-null columns only.  p_rowid_tbl.COUNT',p_rowid_tbl.COUNT);
1163 
1164     --<Bug 15927193 Start>
1165    SELECT
1166       tab.column_name
1167    ,  tab.data_type
1168    BULK COLLECT INTO
1169       l_column_name_tbl
1170    ,  l_data_type_tbl
1171    FROM
1172       ALL_TAB_COLUMNS tab,
1173       ALL_SYNONYMS syn
1174    WHERE tab.TABLE_NAME = syn.table_name
1175    AND tab.owner=syn.owner
1176    AND tab.owner = l_table_owner
1177     AND syn.synonym_name=  l_table_name
1178    ORDER BY tab.column_id
1179    ;
1180     --<Bug 15927193 End>
1181 
1182    IF (p_rowid_tbl.COUNT = 1 AND p_rowid_tbl(1) = c_all_rows(1)) THEN
1183 
1184       l_rowid_tbl := po_tbl_varchar2000();
1185 
1186       OPEN l_rowid_csr FOR 'SELECT rowid FROM '||l_table_name ;
1187 
1188       LOOP
1189 
1190          FETCH l_rowid_csr INTO l_char;
1191          EXIT WHEN l_rowid_csr%NOTFOUND;
1192 
1193          l_rowid_tbl.EXTEND;
1194          l_rowid_tbl(l_rowid_tbl.COUNT) := l_char;
1195 
1196       END LOOP;
1197 
1198       CLOSE l_rowid_csr;
1199 
1200    ELSE
1201       l_rowid_tbl := p_rowid_tbl;
1202    END IF;
1203 
1204    FOR i IN 1 .. l_column_name_tbl.COUNT LOOP
1205 
1206       IF (l_data_type_tbl(i) = 'NUMBER') THEN
1207 
1208          l_sql := 'TO_CHAR(' || l_column_name_tbl(i) || ')';
1209 
1210       ELSIF (l_data_type_tbl(i) = 'DATE') THEN
1211 
1212          l_sql := 'TO_CHAR(' || l_column_name_tbl(i) || ', ''DD-MON-RRRR HH:MI:SSAM'')';
1213 
1214       ELSIF (l_data_type_tbl(i) = 'VARCHAR2') THEN
1215 
1216          l_sql := l_column_name_tbl(i);
1217 
1218       END IF;
1219 
1220       IF (l_sql IS NULL AND p_column_name_tbl IS NULL) THEN
1221 
1222          stmt(l_log_head||'COLUMN',NULL,
1223             'Unprintable column: '|| l_column_name_tbl(i) || ' (' || l_data_type_tbl(i) || ')');
1224 
1225       ELSIF (l_sql IS NOT NULL) THEN
1226 
1227          IF (p_column_name_tbl IS NULL) THEN
1228             l_print_column_flag := TRUE;
1229          ELSE
1230             l_print_column_flag := FALSE;
1231             FOR j IN 1 .. p_column_name_tbl.COUNT LOOP
1232                IF (l_column_name_tbl(i) = UPPER(p_column_name_tbl(j))) THEN
1233                   l_print_column_flag := TRUE;
1234                   EXIT;
1235                END IF;
1236             END LOOP;
1237          END IF;
1238 
1239          IF l_print_column_flag THEN
1240 
1241             l_printable_column_tbl.EXTEND;
1242             l_printable_column_tbl(l_printable_column_tbl.COUNT) := l_column_name_tbl(i);
1243 
1244             l_sql := 'SELECT SUBSTR(' || l_sql || ',1,3900)'
1245                   ||' FROM ' || l_table_name
1246                   ||' WHERE rowid = :b_rowid';
1247 
1248             FOR j IN 1 .. l_rowid_tbl.COUNT LOOP
1249 
1250                BEGIN
1251 
1252                   EXECUTE IMMEDIATE l_sql INTO l_char USING l_rowid_tbl(j);
1253 
1254                EXCEPTION
1255                   WHEN OTHERS THEN
1256                      l_char := SQLERRM;
1257                END;
1258 
1259                l_value_rowid_tbl.EXTEND;
1260                l_value_rowid_tbl(l_value_rowid_tbl.COUNT) := l_rowid_tbl(j);
1261 
1262                l_value_tbl.EXTEND;
1263                l_value_tbl(l_value_tbl.COUNT) := l_char;
1264 
1265             END LOOP;
1266 
1267          END IF;
1268 
1269       END IF;
1270 
1271    END LOOP;
1272 
1273 
1274    -- Report input columns that don't exist / aren't printable.
1275 
1276    IF (p_column_name_tbl IS NOT NULL) THEN
1277 
1278       FOR i IN 1 .. p_column_name_tbl.COUNT LOOP
1279 
1280          l_print_column_flag := FALSE;
1281 
1282          FOR j IN 1 .. l_column_name_tbl.COUNT LOOP
1283             IF (UPPER(p_column_name_tbl(i)) = l_column_name_tbl(j)) THEN
1284                l_print_column_flag := TRUE;
1285                EXIT;
1286             END IF;
1287          END LOOP;
1288 
1289          IF (NOT l_print_column_flag) THEN
1290            stmt(l_log_head||'COLUMN',NULL,
1291                'Non-existent column: '|| p_column_name_tbl(i));
1292          ELSE
1293 
1294             l_print_column_flag := FALSE;
1295 
1296             FOR j IN 1 .. l_printable_column_tbl.COUNT LOOP
1297                IF (UPPER(p_column_name_tbl(i)) = l_printable_column_tbl(j)) THEN
1298                   l_print_column_flag := TRUE;
1299                   EXIT;
1300                END IF;
1301             END LOOP;
1302 
1303             IF (NOT l_print_column_flag) THEN
1304                stmt(l_log_head||'COLUMN',NULL,
1305                   'Unprintable column: '|| l_column_name_tbl(i) || ' (unprintable data type)');
1306             END IF;
1307 
1308          END IF;
1309 
1310       END LOOP;
1311 
1312    END IF;
1313 
1314 
1315    FOR i IN 1 .. l_rowid_tbl.COUNT LOOP
1316 
1317       l_col_i := 1;
1318 
1319       FOR j IN 1 .. l_value_rowid_tbl.COUNT LOOP
1320 
1321          IF (l_value_rowid_tbl(j) = l_rowid_tbl(i)) THEN
1322 
1323           IF (l_value_tbl(j) IS NOT NULL) THEN
1324             stmt(l_log_head||'ROW',NULL,
1328 
1325                l_rowid_tbl(i)||'.'||l_printable_column_tbl(l_col_i),
1326                l_value_tbl(j));
1327           END IF;
1329             l_col_i := l_col_i + 1;
1330 
1331          END IF;
1332 
1333       END LOOP;
1334 
1335    END LOOP;
1336 
1337 END IF;
1338 
1339 EXCEPTION
1340 WHEN OTHERS THEN
1341   IF d_stmt THEN
1342 
1343     l_log_head := p_module_base||TO_CHAR(p_position)||'.DEBUG_TABLE.'||p_table_name||'.'||'EXCEPTION';
1344 
1345     stmt(l_log_head,NULL,SQLERRM);
1346 
1347     stmt(l_log_head,NULL,'p_rowid_tbl',p_rowid_tbl);
1348     stmt(l_log_head,NULL,'p_column_name_tbl',p_column_name_tbl);
1349     stmt(l_log_head,NULL,'l_table_owner',l_table_owner);
1350     stmt(l_log_head,NULL,'l_rowid_tbl',l_rowid_tbl);
1351     stmt(l_log_head,NULL,'l_column_name_tbl',l_column_name_tbl);
1352     stmt(l_log_head,NULL,'l_printable_column_tbl',l_printable_column_tbl);
1353     stmt(l_log_head,NULL,'l_sql',l_sql);
1354     stmt(l_log_head,NULL,'l_char',l_char);
1355     stmt(l_log_head,NULL,'l_table_name',l_table_name);
1356     stmt(l_log_head,NULL,'l_table_owner',l_table_owner);
1357 
1358   END IF;
1359 
1360 END stmt_table;
1361 
1362 -- PROCEDURE-level logging.
1363 
1364 PROCEDURE proc_begin(
1365   p_module_base                   IN  VARCHAR2
1366 )
1367 IS
1368 BEGIN
1369 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,D_START_OF_SUBPROGRAM);
1370 END proc_begin;
1371 
1372 PROCEDURE proc_begin(
1373   p_module_base                   IN  VARCHAR2
1374 , p_parameter_name                IN  VARCHAR2
1375 , p_parameter_value               IN  VARCHAR2
1376 )
1377 IS
1378 BEGIN
1379 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1380   var_to_string(p_parameter_name,p_parameter_value));
1381 END proc_begin;
1382 
1383 PROCEDURE proc_begin(
1384   p_module_base                   IN  VARCHAR2
1385 , p_parameter_name                IN  VARCHAR2
1386 , p_parameter_value               IN  NUMBER
1387 )
1388 IS
1389 BEGIN
1390 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1391   var_to_string(p_parameter_name,p_parameter_value));
1392 END proc_begin;
1393 
1394 PROCEDURE proc_begin(
1395   p_module_base                   IN  VARCHAR2
1396 , p_parameter_name                IN  VARCHAR2
1397 , p_parameter_value               IN  DATE
1398 )
1399 IS
1400 BEGIN
1401 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1402   var_to_string(p_parameter_name,p_parameter_value));
1403 END proc_begin;
1404 
1405 PROCEDURE proc_begin(
1406   p_module_base                   IN  VARCHAR2
1407 , p_parameter_name                IN  VARCHAR2
1408 , p_parameter_value               IN  BOOLEAN
1409 )
1410 IS
1411 BEGIN
1412 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1413   var_to_string(p_parameter_name,p_parameter_value));
1414 END proc_begin;
1415 
1416 PROCEDURE proc_begin(
1417   p_module_base                   IN  VARCHAR2
1418 , p_parameter_name                IN  VARCHAR2
1419 , p_parameter_value               IN  PO_TBL_NUMBER
1420 )
1421 IS
1422 BEGIN
1423 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1424   p_parameter_name,p_parameter_value);
1425 END proc_begin;
1426 
1427 PROCEDURE proc_begin(
1428   p_module_base                   IN  VARCHAR2
1429 , p_parameter_name                IN  VARCHAR2
1430 , p_parameter_value               IN  PO_TBL_DATE
1431 )
1432 IS
1433 BEGIN
1434 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1435   p_parameter_name,p_parameter_value);
1436 END proc_begin;
1437 
1438 PROCEDURE proc_begin(
1439   p_module_base                   IN  VARCHAR2
1440 , p_parameter_name                IN  VARCHAR2
1441 , p_parameter_value               IN  PO_TBL_VARCHAR1
1442 )
1443 IS
1444 BEGIN
1445 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1446   p_parameter_name,p_parameter_value);
1447 END proc_begin;
1448 
1449 PROCEDURE proc_begin(
1450   p_module_base                   IN  VARCHAR2
1451 , p_parameter_name                IN  VARCHAR2
1452 , p_parameter_value               IN  PO_TBL_VARCHAR5
1453 )
1454 IS
1455 BEGIN
1456 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1457   p_parameter_name,p_parameter_value);
1458 END proc_begin;
1459 
1460 PROCEDURE proc_begin(
1461   p_module_base                   IN  VARCHAR2
1462 , p_parameter_name                IN  VARCHAR2
1463 , p_parameter_value               IN  PO_TBL_VARCHAR30
1464 )
1465 IS
1466 BEGIN
1467 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1468   p_parameter_name,p_parameter_value);
1469 END proc_begin;
1470 
1471 PROCEDURE proc_begin(
1472   p_module_base                   IN  VARCHAR2
1473 , p_parameter_name                IN  VARCHAR2
1474 , p_parameter_value               IN  PO_TBL_VARCHAR100
1475 )
1476 IS
1477 BEGIN
1478 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1479   p_parameter_name,p_parameter_value);
1480 END proc_begin;
1481 
1482 PROCEDURE proc_begin(
1483   p_module_base                   IN  VARCHAR2
1484 , p_parameter_name                IN  VARCHAR2
1485 , p_parameter_value               IN  PO_TBL_VARCHAR2000
1486 )
1487 IS
1488 BEGIN
1489 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1490   p_parameter_name,p_parameter_value);
1491 END proc_begin;
1492 
1493 PROCEDURE proc_begin(
1494   p_module_base                   IN  VARCHAR2
1495 , p_parameter_name                IN  VARCHAR2
1496 , p_parameter_value               IN  PO_TBL_VARCHAR4000
1497 )
1498 IS
1499 BEGIN
1500 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_BEGIN,
1504 PROCEDURE proc_end(
1501   p_parameter_name,p_parameter_value);
1502 END proc_begin;
1503 
1505   p_module_base                   IN  VARCHAR2
1506 )
1507 IS
1508 BEGIN
1509 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,D_END_OF_SUBPROGRAM);
1510 END proc_end;
1511 
1512 PROCEDURE proc_end(
1513   p_module_base                   IN  VARCHAR2
1514 , p_parameter_name                IN  VARCHAR2
1515 , p_parameter_value               IN  VARCHAR2
1516 )
1517 IS
1518 BEGIN
1519 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1520   var_to_string(p_parameter_name,p_parameter_value));
1521 END proc_end;
1522 
1523 PROCEDURE proc_end(
1524   p_module_base                   IN  VARCHAR2
1525 , p_parameter_name                IN  VARCHAR2
1526 , p_parameter_value               IN  NUMBER
1527 )
1528 IS
1529 BEGIN
1530 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1531   var_to_string(p_parameter_name,p_parameter_value));
1532 END proc_end;
1533 
1534 PROCEDURE proc_end(
1535   p_module_base                   IN  VARCHAR2
1536 , p_parameter_name                IN  VARCHAR2
1537 , p_parameter_value               IN  DATE
1538 )
1539 IS
1540 BEGIN
1541 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1542   var_to_string(p_parameter_name,p_parameter_value));
1543 END proc_end;
1544 
1545 PROCEDURE proc_end(
1546   p_module_base                   IN  VARCHAR2
1547 , p_parameter_name                IN  VARCHAR2
1548 , p_parameter_value               IN  BOOLEAN
1549 )
1550 IS
1551 BEGIN
1552 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1553   var_to_string(p_parameter_name,p_parameter_value));
1554 END proc_end;
1555 
1556 PROCEDURE proc_end(
1557   p_module_base                   IN  VARCHAR2
1558 , p_parameter_name                IN  VARCHAR2
1559 , p_parameter_value               IN  PO_TBL_NUMBER
1560 )
1561 IS
1562 BEGIN
1563 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1564   p_parameter_name,p_parameter_value);
1565 END proc_end;
1566 
1567 PROCEDURE proc_end(
1568   p_module_base                   IN  VARCHAR2
1569 , p_parameter_name                IN  VARCHAR2
1570 , p_parameter_value               IN  PO_TBL_DATE
1571 )
1572 IS
1573 BEGIN
1574 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1575   p_parameter_name,p_parameter_value);
1576 END proc_end;
1577 
1578 PROCEDURE proc_end(
1579   p_module_base                   IN  VARCHAR2
1580 , p_parameter_name                IN  VARCHAR2
1581 , p_parameter_value               IN  PO_TBL_VARCHAR1
1582 )
1583 IS
1584 BEGIN
1585 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1586   p_parameter_name,p_parameter_value);
1587 END proc_end;
1588 
1589 PROCEDURE proc_end(
1590   p_module_base                   IN  VARCHAR2
1591 , p_parameter_name                IN  VARCHAR2
1592 , p_parameter_value               IN  PO_TBL_VARCHAR5
1593 )
1594 IS
1595 BEGIN
1596 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1597   p_parameter_name,p_parameter_value);
1598 END proc_end;
1599 
1600 PROCEDURE proc_end(
1601   p_module_base                   IN  VARCHAR2
1602 , p_parameter_name                IN  VARCHAR2
1603 , p_parameter_value               IN  PO_TBL_VARCHAR30
1604 )
1605 IS
1606 BEGIN
1607 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1608   p_parameter_name,p_parameter_value);
1609 END proc_end;
1610 
1611 PROCEDURE proc_end(
1612   p_module_base                   IN  VARCHAR2
1613 , p_parameter_name                IN  VARCHAR2
1614 , p_parameter_value               IN  PO_TBL_VARCHAR100
1615 )
1616 IS
1617 BEGIN
1618 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1619   p_parameter_name,p_parameter_value);
1620 END proc_end;
1621 
1622 PROCEDURE proc_end(
1623   p_module_base                   IN  VARCHAR2
1624 , p_parameter_name                IN  VARCHAR2
1625 , p_parameter_value               IN  PO_TBL_VARCHAR2000
1626 )
1627 IS
1628 BEGIN
1629 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1630   p_parameter_name,p_parameter_value);
1631 END proc_end;
1632 
1633 PROCEDURE proc_end(
1634   p_module_base                   IN  VARCHAR2
1635 , p_parameter_name                IN  VARCHAR2
1636 , p_parameter_value               IN  PO_TBL_VARCHAR4000
1637 )
1638 IS
1639 BEGIN
1640 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_END,
1641   p_parameter_name,p_parameter_value);
1642 END proc_end;
1643 
1644 PROCEDURE proc_return(
1645   p_module_base                   IN  VARCHAR2
1646 , p_return_value                  IN  VARCHAR2
1647 )
1648 IS
1649 BEGIN
1650 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1651   var_to_string(D_RETURN_VALUE,p_return_value));
1652 END proc_return;
1653 
1654 PROCEDURE proc_return(
1655   p_module_base                   IN  VARCHAR2
1656 , p_return_value                  IN  NUMBER
1657 )
1658 IS
1659 BEGIN
1660 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1661   var_to_string(D_RETURN_VALUE,p_return_value));
1662 END proc_return;
1663 
1664 PROCEDURE proc_return(
1665   p_module_base                   IN  VARCHAR2
1666 , p_return_value                  IN  DATE
1667 )
1668 IS
1669 BEGIN
1670 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1671   var_to_string(D_RETURN_VALUE,p_return_value));
1672 END proc_return;
1673 
1674 PROCEDURE proc_return(
1675   p_module_base                   IN  VARCHAR2
1676 , p_return_value                  IN  BOOLEAN
1677 )
1678 IS
1679 BEGIN
1680 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1684 PROCEDURE proc_return(
1681   var_to_string(D_RETURN_VALUE,p_return_value));
1682 END proc_return;
1683 
1685   p_module_base                   IN  VARCHAR2
1686 , p_return_value                  IN  PO_TBL_NUMBER
1687 )
1688 IS
1689 BEGIN
1690 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1691   D_RETURN_VALUE,p_return_value);
1692 END proc_return;
1693 
1694 PROCEDURE proc_return(
1695   p_module_base                   IN  VARCHAR2
1696 , p_return_value                  IN  PO_TBL_DATE
1697 )
1698 IS
1699 BEGIN
1700 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1701   D_RETURN_VALUE,p_return_value);
1702 END proc_return;
1703 
1704 PROCEDURE proc_return(
1705   p_module_base                   IN  VARCHAR2
1706 , p_return_value                  IN  PO_TBL_VARCHAR1
1707 )
1708 IS
1709 BEGIN
1710 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1711   D_RETURN_VALUE,p_return_value);
1712 END proc_return;
1713 
1714 PROCEDURE proc_return(
1715   p_module_base                   IN  VARCHAR2
1716 , p_return_value                  IN  PO_TBL_VARCHAR5
1717 )
1718 IS
1719 BEGIN
1720 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1721   D_RETURN_VALUE,p_return_value);
1722 END proc_return;
1723 
1724 PROCEDURE proc_return(
1725   p_module_base                   IN  VARCHAR2
1726 , p_return_value                  IN  PO_TBL_VARCHAR30
1727 )
1728 IS
1729 BEGIN
1730 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1731   D_RETURN_VALUE,p_return_value);
1732 END proc_return;
1733 
1734 PROCEDURE proc_return(
1735   p_module_base                   IN  VARCHAR2
1736 , p_return_value                  IN  PO_TBL_VARCHAR100
1737 )
1738 IS
1739 BEGIN
1740 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1741   D_RETURN_VALUE,p_return_value);
1742 END proc_return;
1743 
1744 PROCEDURE proc_return(
1745   p_module_base                   IN  VARCHAR2
1746 , p_return_value                  IN  PO_TBL_VARCHAR2000
1747 )
1748 IS
1749 BEGIN
1750 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1751   D_RETURN_VALUE,p_return_value);
1752 END proc_return;
1753 
1754 PROCEDURE proc_return(
1755   p_module_base                   IN  VARCHAR2
1756 , p_return_value                  IN  PO_TBL_VARCHAR4000
1757 )
1758 IS
1759 BEGIN
1760 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RETURN,
1761   D_RETURN_VALUE,p_return_value);
1762 END proc_return;
1763 
1764 PROCEDURE proc_raise(
1765   p_module_base                   IN  VARCHAR2
1766 )
1767 IS
1768 BEGIN
1769 log(FND_LOG.LEVEL_PROCEDURE,p_module_base,D_RAISE,
1770   'Raising exception: SQLERRM = '||SQLERRM);
1771 END proc_raise;
1772 
1773 -- EVENT-level logging.
1774 
1775 PROCEDURE event(
1776   p_module_base                   IN  VARCHAR2
1777 , p_position                      IN  NUMBER
1778 , p_message_text                  IN  VARCHAR2
1779 )
1780 IS
1781 BEGIN
1782 log(FND_LOG.LEVEL_EVENT,p_module_base,TO_CHAR(p_position),p_message_text);
1783 END event;
1784 
1785 -- EXCEPTION-level logging.
1786 
1787 PROCEDURE exc(
1788   p_module_base                   IN  VARCHAR2
1789 , p_position                      IN  NUMBER
1790 , p_message_text                  IN  VARCHAR2  DEFAULT NULL
1791 )
1792 IS
1793 BEGIN
1794 log(FND_LOG.LEVEL_EXCEPTION,p_module_base,TO_CHAR(p_position)||'.EXCEPTION',
1795   p_message_text||';SQLERRM = '||SQLERRM);
1796 END exc;
1797 
1798 
1799 -----------------------------------------------------------------------------
1800 -- Package initialization.
1801 -----------------------------------------------------------------------------
1802 
1803 BEGIN
1804 
1805   refresh_log_flags();
1806 
1807 END PO_LOG;