您的位置:首页 > 移动开发

DBMS_APPLICATION_INFO

2016-02-21 20:47 274 查看
官方文档: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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: