Oracle - Tracking Progress without DBMS_OUTPUT buffering issues
Oracle's dbms_output.put_line(...) functionality works fine unless you actually want to see output while a script is running.
Disclaimer: This "solution" requires access to V$SESSION. Confirm before preceeding.
For some reason known only to the Oracle gods [pun intended], this output is buffered until the block / script completes.  My preferred workaround is to use DBMS_APPLICATION_INFO.SET_CLIENT_INFO(text) and then to query v$session for column CLIENT_INFO by the appropriate criteria (e.g. SID, Serial#, USERNAME,...).
select s.client_info, s.program, s.status, s.SID||' - '||s.SERIAL# from v$session s where s.username = 'JVOGEL';
Disclaimer: I'm sure there is a performance penalty of some sort. The real-time feedback is critical so I'm willing to accept the trade-off. In a loop you could choose to only invoke the routine every "x" number of occurrences.
I've encapsulated this into a "common" routine that I use called
SetRunStatus.  /**
SetRunStatus('Evaluating Record Status',n_index => i,n_count => ln_count,n_id => lnt_remit_queue_id_list(i));
*/
PROCEDURE SetRunStatus(
 s_msg          IN   VARCHAR2,
 n_count        IN   NUMBER := Null,
 n_index        IN   NUMBER := Null,
 n_id           IN   NUMBER := Null )
IS
 ls_msg     VARCHAR2(64) := Null;
BEGIN
 
 IF (n_index > 0) THEN 
  ls_msg := ls_msg||' '||n_index;
 END IF;
 IF (n_count > 0) THEN
  ls_msg := ls_msg||' of '||n_count;
 END IF;
 IF (n_id > 0) THEN
  ls_msg := ls_msg||' [ID:'||n_id||']';
 END IF;
 ls_msg := SUBSTR('[Remit] '||TRIM(s_msg||ls_msg),1,64);
 DBMS_APPLICATION_INFO.SET_CLIENT_INFO(ls_msg);
 EXCEPTION
  WHEN OTHERS THEN 
   Null; -- Swallow any exceptions caused by SetRunStatus 
END SetRunStatus;
 
 
 Posts
Posts
 
 
No comments:
Post a Comment