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;
No comments:
Post a Comment