1: package body FND_LOG as
2: /* $Header: AFUTLOGB.pls 120.5.12010000.3 2010/03/17 17:29:22 pferguso ship $ */
3: /* Documentation for this package is at */
4: /* http://www-apps.us.oracle.com/logging/ */
5:
68: l_seq NUMBER;
69:
70: begin
71:
72: if (LOG_LEVEL >= FND_LOG.LEVEL_EXCEPTION) THEN
73: CALL_STACK := DBMS_UTILITY.FORMAT_CALL_STACK;
74: ERR_STACK := DBMS_UTILITY.FORMAT_ERROR_STACK;
75: end if;
76:
73: CALL_STACK := DBMS_UTILITY.FORMAT_CALL_STACK;
74: ERR_STACK := DBMS_UTILITY.FORMAT_ERROR_STACK;
75: end if;
76:
77: l_seq := FND_LOG_REPOSITORY.STR_UNCHKED_INT_WITH_CONTEXT(
78: LOG_LEVEL => LOG_LEVEL,
79: MODULE => MODULE,
80: MESSAGE_TEXT => MESSAGE_TEXT,
81: ENCODED => ENCODED,
99: ** PUBLIC PROCEDURES
100: */
101:
102: /*
103: ** FND_LOG.INIT_TRANSACTION
104: **
105: ** Description:
106: ** Initializes a log transaction. A log transaction
107: ** corresponds to an instance or invocation of a single
142: l_transaction_context_id number;
143: begin
144:
145: l_transaction_context_id :=
146: FND_LOG_REPOSITORY.INIT_TRANS_INT_WITH_CONTEXT(
147: CONC_REQUEST_ID => CONC_REQUEST_ID,
148: FORM_ID => FORM_ID,
149: FORM_APPLICATION_ID => FORM_APPLICATION_ID,
150: CONCURRENT_PROCESS_ID => CONCURRENT_PROCESS_ID,
154: return l_transaction_context_id;
155:
156: exception
157: when others then
158: generic_error('FND_LOG.INIT_TRANSACTION', SQLCODE, SQLERRM);
159: return -1;
160:
161:
162: end INIT_TRANSACTION;
161:
162: end INIT_TRANSACTION;
163:
164: /*
165: ** FND_LOG.SET_TRANSACTION
166: ** Description:
167: ** Sets the log transaction ID for the current DB connection.
168: ** This routine should be used whenever the database connection
169: ** changes within the context of a transaction. For example, this
180: begin
181:
182: select count(*)
183: into dummy
184: from FND_LOG_TRANSACTION_CONTEXT
185: where TRANSACTION_CONTEXT_ID = TRANS_CONTEXT_ID;
186:
187: if (dummy = 1) then
188: FND_LOG.G_TRANSACTION_CONTEXT_ID := TRANS_CONTEXT_ID;
184: from FND_LOG_TRANSACTION_CONTEXT
185: where TRANSACTION_CONTEXT_ID = TRANS_CONTEXT_ID;
186:
187: if (dummy = 1) then
188: FND_LOG.G_TRANSACTION_CONTEXT_ID := TRANS_CONTEXT_ID;
189: else
190: internal_message('bad TRANSACTION_CONTEXT_ID: '|| TRANS_CONTEXT_ID);
191: internal_message('TRANSACTION_CONTEXT_ID not found in table FND_LOG_TRANSACTION_CONTEXT');
192: raise bad_parameter;
187: if (dummy = 1) then
188: FND_LOG.G_TRANSACTION_CONTEXT_ID := TRANS_CONTEXT_ID;
189: else
190: internal_message('bad TRANSACTION_CONTEXT_ID: '|| TRANS_CONTEXT_ID);
191: internal_message('TRANSACTION_CONTEXT_ID not found in table FND_LOG_TRANSACTION_CONTEXT');
192: raise bad_parameter;
193: end if;
194:
195: end SET_TRANSACTION;
210: if (LOG_LEVEL < G_CURRENT_RUNTIME_LEVEL) then
211: return;
212: end if;
213:
214: if FND_LOG_REPOSITORY.CHECK_ACCESS_INTERNAL (MODULE, LOG_LEVEL) then
215: l_message := substrb(MESSAGE,1,4000); --6313496
216: l_seq := STR_UNCHKED_INT_WITH_CONTEXT(
217: LOG_LEVEL => LOG_LEVEL,
218: MODULE => MODULE,
249: if (LOG_LEVEL < G_CURRENT_RUNTIME_LEVEL) then
250: return;
251: end if;
252:
253: if FND_LOG_REPOSITORY.CHECK_ACCESS_INTERNAL (MODULE, LOG_LEVEL) then
254:
255: l_message:=substrb(MESSAGE,1,4000); --6313496
256:
257: l_seq := STR_UNCHKED_INT_WITH_CONTEXT(
283: if (LOG_LEVEL < G_CURRENT_RUNTIME_LEVEL) then
284: return l_sequence;
285: end if;
286:
287: if FND_LOG_REPOSITORY.CHECK_ACCESS_INTERNAL (MODULE, LOG_LEVEL) then
288: msg_buf := FND_MESSAGE.GET_ENCODED(AUTO_LOG);
289: l_sequence := STR_UNCHKED_INT_WITH_CONTEXT(
290: LOG_LEVEL => LOG_LEVEL,
291: MODULE => MODULE,
343: ** The message is popped off the message dictionary stack, if POP_MESSAGE
344: ** is TRUE. Pass FALSE for POP_MESSAGE if the message will also be
345: ** displayed to the user later.
346: ** Code Sample:
347: ** if( FND_LOG.LEVEL_UNEXPECTED >=
348: ** FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
349: ** FND_MESSAGE.SET_NAME(...); -- Set message
350: ** FND_MESSAGE.SET_TOKEN(...); -- Set token in message
351: ** ATTACHMENT_ID := FND_LOG.MESSAGE_WITH_ATTACHMENT(FND_LOG.LEVEL_UNEXPECTED,...,TRUE);
344: ** is TRUE. Pass FALSE for POP_MESSAGE if the message will also be
345: ** displayed to the user later.
346: ** Code Sample:
347: ** if( FND_LOG.LEVEL_UNEXPECTED >=
348: ** FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
349: ** FND_MESSAGE.SET_NAME(...); -- Set message
350: ** FND_MESSAGE.SET_TOKEN(...); -- Set token in message
351: ** ATTACHMENT_ID := FND_LOG.MESSAGE_WITH_ATTACHMENT(FND_LOG.LEVEL_UNEXPECTED,...,TRUE);
352: ** if ( ATTACHMENT_ID <> -1 ) then
347: ** if( FND_LOG.LEVEL_UNEXPECTED >=
348: ** FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
349: ** FND_MESSAGE.SET_NAME(...); -- Set message
350: ** FND_MESSAGE.SET_TOKEN(...); -- Set token in message
351: ** ATTACHMENT_ID := FND_LOG.MESSAGE_WITH_ATTACHMENT(FND_LOG.LEVEL_UNEXPECTED,...,TRUE);
352: ** if ( ATTACHMENT_ID <> -1 ) then
353: ** -- For ASCII data use WRITE
354: ** FND_LOG_ATTACHMENT.WRITE(ATTACHMENT_ID, ...);
355: ** -- For Non-ASCII data use WRITE_RAW
350: ** FND_MESSAGE.SET_TOKEN(...); -- Set token in message
351: ** ATTACHMENT_ID := FND_LOG.MESSAGE_WITH_ATTACHMENT(FND_LOG.LEVEL_UNEXPECTED,...,TRUE);
352: ** if ( ATTACHMENT_ID <> -1 ) then
353: ** -- For ASCII data use WRITE
354: ** FND_LOG_ATTACHMENT.WRITE(ATTACHMENT_ID, ...);
355: ** -- For Non-ASCII data use WRITE_RAW
356: ** FND_LOG_ATTACHMENT.WRITE_RAW(ATTACHMENT_ID, ...);
357: ** FND_LOG_ATTACHMENT.CLOSE(ATTACHMENT_ID);
358: ** end if;
352: ** if ( ATTACHMENT_ID <> -1 ) then
353: ** -- For ASCII data use WRITE
354: ** FND_LOG_ATTACHMENT.WRITE(ATTACHMENT_ID, ...);
355: ** -- For Non-ASCII data use WRITE_RAW
356: ** FND_LOG_ATTACHMENT.WRITE_RAW(ATTACHMENT_ID, ...);
357: ** FND_LOG_ATTACHMENT.CLOSE(ATTACHMENT_ID);
358: ** end if;
359: ** end if;
360: */
353: ** -- For ASCII data use WRITE
354: ** FND_LOG_ATTACHMENT.WRITE(ATTACHMENT_ID, ...);
355: ** -- For Non-ASCII data use WRITE_RAW
356: ** FND_LOG_ATTACHMENT.WRITE_RAW(ATTACHMENT_ID, ...);
357: ** FND_LOG_ATTACHMENT.CLOSE(ATTACHMENT_ID);
358: ** end if;
359: ** end if;
360: */
361: FUNCTION MESSAGE_WITH_ATTACHMENT(LOG_LEVEL IN NUMBER,
370: l_sequence number := -1;
371: begin
372: l_sequence := MESSAGE_INTERNAL(LOG_LEVEL, MODULE, POP_MESSAGE, 'N');
373: if ( l_sequence > 0 ) then
374: FND_LOG_REPOSITORY.INSERT_BLOB(l_sequence, P_CHARSET, P_MIMETYPE,
375: P_ENCODING, P_LANG, P_FILE_EXTN, P_DESC);
376: end if;
377: return l_sequence;
378: end;
404: if (LOG_LEVEL < G_CURRENT_RUNTIME_LEVEL) then
405: return;
406: end if;
407:
408: if FND_LOG_REPOSITORY.CHECK_ACCESS_INTERNAL (MODULE, LOG_LEVEL) then
409: msg_buf := FND_MESSAGE.GET_ENCODED;
410:
411: l_seq := STR_UNCHKED_INT_WITH_CONTEXT(
412: LOG_LEVEL => LOG_LEVEL,
428: end;
429:
430:
431: /*
432: ** FND_LOG.WORK_METRIC
433: ** Description:
434: ** Writes a metric value out to the FND tables in an
435: ** autonomous transaction. Posting to the Business Event
436: ** system is deferred until WORK_METRICS_EVENT is called.
435: ** autonomous transaction. Posting to the Business Event
436: ** system is deferred until WORK_METRICS_EVENT is called.
437: **
438: ** Arguments:
439: ** Module - Module name (See FND_LOG standards.)
440: ** Metric_code - Internal name of metric.
441: ** Metric_value - Value for metric (string, number, or date)
442: **
443: */
446: METRIC_CODE IN VARCHAR2,
447: METRIC_VALUE IN VARCHAR2) is
448:
449: begin
450: FND_LOG_REPOSITORY.METRIC_INTERNAL_WITH_CONTEXT(
451: MODULE => MODULE,
452: METRIC_CODE => METRIC_CODE,
453: METRIC_VALUE_STRING => METRIC_VALUE);
454: end WORK_METRIC;
457: METRIC_CODE IN VARCHAR2,
458: METRIC_VALUE IN NUMBER) is
459:
460: begin
461: FND_LOG_REPOSITORY.METRIC_INTERNAL_WITH_CONTEXT(
462: MODULE => MODULE,
463: METRIC_CODE => METRIC_CODE,
464: METRIC_VALUE_NUMBER => METRIC_VALUE);
465: end WORK_METRIC;
468: METRIC_CODE IN VARCHAR2,
469: METRIC_VALUE IN DATE) is
470:
471: begin
472: FND_LOG_REPOSITORY.METRIC_INTERNAL_WITH_CONTEXT(
473: MODULE => MODULE,
474: METRIC_CODE => METRIC_CODE,
475: METRIC_VALUE_DATE => METRIC_VALUE);
476: end WORK_METRIC;
475: METRIC_VALUE_DATE => METRIC_VALUE);
476: end WORK_METRIC;
477:
478: /*
479: ** FND_LOG.WORK_METRICS_EVENT
480: ** Description:
481: ** Posts the pending metrics for the current component
482: ** session to the Business Event system and updates the pending
483: ** metrics with the event key. The metrics will be bundled in an
491:
492: PROCEDURE WORK_METRICS_EVENT(CONTEXT_ID IN NUMBER DEFAULT NULL) IS
493: begin
494:
495: FND_LOG_REPOSITORY.METRICS_EVENT_INT_WITH_CONTEXT(CONTEXT_ID);
496:
497: end WORK_METRICS_EVENT;
498:
499: /*
496:
497: end WORK_METRICS_EVENT;
498:
499: /*
500: ** FND_LOG.GET_TEXT
501: **
502: ** Description:
503: ** Retrieves the fully translated message text, given a log sequence ID
504: **
502: ** Description:
503: ** Retrieves the fully translated message text, given a log sequence ID
504: **
505: ** Arguments:
506: ** log_sequence_id - FND_LOG message identifier.
507: ** lang - Language code for translation (optional).
508: **
509: ** Returns:
510: ** If an encoded message, the full translated text of the message.
517: --6434437, the tok_val variable was too small
518: --I also went ahead and modified msg_text and msg just in case
519: --the underlying columns are changed in the future.
520:
521: msg_text fnd_log_messages.message_text%type;
522: msg fnd_new_messages.message_text%type;
523: tok_val fnd_log_messages.message_text%type;
524:
525:
519: --the underlying columns are changed in the future.
520:
521: msg_text fnd_log_messages.message_text%type;
522: msg fnd_new_messages.message_text%type;
523: tok_val fnd_log_messages.message_text%type;
524:
525:
526: encoded varchar2(1);
527: msg_app_short_name varchar2(50);
538:
539: begin
540: select MESSAGE_TEXT, DECODE(ENCODED, 'Y', 'Y', 'N')
541: into msg_text, encoded
542: from FND_LOG_MESSAGES
543: where LOG_SEQUENCE = LOG_SEQUENCE_ID;
544:
545: if (encoded = 'N') then
546: return msg_text;
564: +--------------------------------------------------------------*/
565: FND_MESSAGE.SET_NAME ('FND', 'SQL-Generic error');
566: FND_MESSAGE.SET_TOKEN ('ERRNO', sqlcode, FALSE);
567: FND_MESSAGE.SET_TOKEN ('REASON', sqlerrm, FALSE);
568: FND_MESSAGE.SET_TOKEN ('ROUTINE', 'FND_LOG.GET_TEXT', FALSE);
569: end;
570: end if;
571:
572: begin
652: begin
653: if ( LOG_LEVEL < G_CURRENT_RUNTIME_LEVEL ) then
654: return FALSE;
655: end if;
656: return FND_LOG_REPOSITORY.CHECK_ACCESS_INTERNAL (MODULE, LOG_LEVEL);
657: end;
658:
659:
660: /**
667: * buffers messages in PL/SQL Collection for Bulk-Inserting.
668: */
669: PROCEDURE SET_BUFFERED_MODE is
670: begin
671: FND_LOG_REPOSITORY.SET_BUFFERED_MODE;
672: end SET_BUFFERED_MODE;
673:
674: /**
675: * Flushes any buffered messages, and switches back to the
676: * default synchronous (non-buffered) logging.
677: */
678: PROCEDURE RESET_BUFFERED_MODE is
679: begin
680: FND_LOG_REPOSITORY.RESET_BUFFERED_MODE;
681: end RESET_BUFFERED_MODE;
682:
683: /**
684: * API for raising a proxy alert on behalf of the given
687: * captured as a parent context.
688: *
689: * This API does the following:
690: * 1) Sets a child context for the given request ID
691: * 2) Raises the proxy alert by calling fnd_log.message in the normal
692: * fashion
693: * 3) Clears the child context.
694: */
695: PROCEDURE PROXY_ALERT_FOR_CONC_REQ(
696: MODULE IN VARCHAR2,
697: POP_MESSAGE IN BOOLEAN DEFAULT NULL,
698: REQUEST_ID IN NUMBER) is
699: BEGIN
700: if (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) then
701: fnd_log_repository.set_child_context_for_conc_req(REQUEST_ID);
702: fnd_log.message(
703: log_level => fnd_log.level_unexpected,
704: module => MODULE,
697: POP_MESSAGE IN BOOLEAN DEFAULT NULL,
698: REQUEST_ID IN NUMBER) is
699: BEGIN
700: if (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) then
701: fnd_log_repository.set_child_context_for_conc_req(REQUEST_ID);
702: fnd_log.message(
703: log_level => fnd_log.level_unexpected,
704: module => MODULE,
705: pop_message => POP_MESSAGE);
698: REQUEST_ID IN NUMBER) is
699: BEGIN
700: if (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) then
701: fnd_log_repository.set_child_context_for_conc_req(REQUEST_ID);
702: fnd_log.message(
703: log_level => fnd_log.level_unexpected,
704: module => MODULE,
705: pop_message => POP_MESSAGE);
706: fnd_log_repository.clear_child_context;
699: BEGIN
700: if (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) then
701: fnd_log_repository.set_child_context_for_conc_req(REQUEST_ID);
702: fnd_log.message(
703: log_level => fnd_log.level_unexpected,
704: module => MODULE,
705: pop_message => POP_MESSAGE);
706: fnd_log_repository.clear_child_context;
707: end if;
702: fnd_log.message(
703: log_level => fnd_log.level_unexpected,
704: module => MODULE,
705: pop_message => POP_MESSAGE);
706: fnd_log_repository.clear_child_context;
707: end if;
708: END PROXY_ALERT_FOR_CONC_REQ;
709:
710: end FND_LOG;
706: fnd_log_repository.clear_child_context;
707: end if;
708: END PROXY_ALERT_FOR_CONC_REQ;
709:
710: end FND_LOG;