Here's a piece of example code in PL/SQL, it takes advantage of package DBMS_APPLICATION_INFO.
declare -- main variables ... -- long op info v_rindex PLS_INTEGER; v_slno PLS_INTEGER; v_totalwork NUMBER; v_sofar NUMBER; v_obj PLS_INTEGER; v_op_name varchar(100) := 'My work'; v_units varchar(100) := 'rows processed'; begin -- Calculate total work (number of rows to be processed, etc.) select count(*) into v_totalwork from ...; v_sofar := 0; v_rindex := DBMS_APPLICATION_INFO.set_session_longops_nohint; for ... -- A loop to process your work loop ... -- do your work here. -- log longops view. v_sofar := v_sofar + 1; if mod( v_sofar, 500 ) = 0 then -- log your operation every 500 rounds DBMS_APPLICATION_INFO.set_session_longops(rindex => v_rindex, slno => v_slno, op_name => v_op_name, target => v_obj, context => 0, sofar => v_sofar, totalwork => v_totalwork, target_desc => 'Some description here', units => v_units); end if; end loop; -- mark the end DBMS_APPLICATION_INFO.set_session_longops(rindex => v_rindex, slno => v_slno, op_name => v_op_name, target => v_obj, context => 0, sofar => v_sofar, totalwork => v_totalwork, target_desc => 'Some description here', units => v_units); end; /
To view the status of the process, run query:
select sid, serial#, opname, sofar, totalwork, start_time, last_update_time from v$session_longops where opname = 'My Work';
Columns sofar and totalwork show you how much work has been done so far.