DBMS_APPLICATION_INFO

官方文档: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;

 

你可能感兴趣的:(DBMS_APPLICATION_INFO)