官方文档:http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_appinf.htm#ARPLS003
https://oracle-base.com/articles/8i/dbms_application_info#end_to_end_tracing_java
DBMS_APPLICATION_INFO允许应用程序向视图v$session,v$session_longops添加统计信息用于追踪程序执行情况。
declare v_module varchar2(2000); v_action varchar2(2000); v_client_info varchar2(2000); begin dbms_application_info.set_module(module_name => 'TestModule', action_name => 'Action_start'); dbms_application_info.set_action(action_name => 'Action01'); dbms_application_info.set_client_info(client_info => 'Client_info01'); dbms_application_info.read_module(module_name => v_module, action_name => v_action); dbms_output.put_line(v_module); --TestModule dbms_output.put_line(v_action); --Action01 dbms_application_info.read_client_info(client_info => v_client_info); dbms_output.put_line(v_client_info); --Client_info01 end;
应用程序开始的时候总是应该注册module和action,用以标识某块和初始化Action,相关SQL:
select sid from v$mystat; select vs.module, vs.action, vs.client_info from v$session vs where vs.sid = 36
ASH中Top Services/modules统计了在抽样会话活动中占较高百分比的SERVICE或者MODULE,AWR中SQL的统计信息中就会标识SQL所属的module。
为了监控操作时间较长的程序,可以通过SET_SESSION_LONGOPS记录执行情况,通过视图V$SESSION_LONGOPS查询具体的执行情况:
DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS ( rindex IN OUT BINARY_INTEGER, slno IN OUT BINARY_INTEGER, --oracle内部使用 op_name IN VARCHAR2 DEFAULT NULL, -- 定义任务名称,最大64个字节 target IN BINARY_INTEGER DEFAULT 0, --对应视图的target context IN BINARY_INTEGER DEFAULT 0, --对应视图的context sofar IN NUMBER DEFAULT 0, --对应视图的sofar totalwork IN NUMBER DEFAULT 0, --对应视图的totalwork target_desc IN VARCHAR2 DEFAULT 'unknown target', --对应视图的total_desc,最大32个字节 units IN VARCHAR2 DEFAULT NULL) --最大32个字节 set_session_longops_nohint constant BINARY_INTEGER := -1;
declare v_rindex binary_integer; v_slno binary_integer; v_sofar number := 0; v_op_name varchar2(64) := 'batch_load'; v_totalwork number := 10; v_target_desc varchar2(32) := 'rows processing'; begin v_rindex := dbms_application_info.set_session_longops_nohint; --在视图v$session_longops中开始新的一行 while v_sofar < 10 loop dbms_lock.sleep(10); --模拟长时间任务 v_sofar := v_sofar + 1; --模拟任务执行进度 dbms_application_info.set_session_longops(rindex => v_rindex, slno => v_slno, --oracle内部使用 op_name => v_op_name, sofar => v_sofar, --对应视图的sofar totalwork => v_totalwork, --对应视图的totalwork target_desc => v_target_desc); end loop; end;
如下SQL可以查看任务的执行情况及执行进度:
select sid, opname, target_desc, sofar, totalwork, units from v$session_longops;