dbms_application_info的使用

SQL> exec dbms_application_info.set_module('module_wang','action_2020');

PL/SQL procedure successfully completed.

SQL> select sys_context('userenv','module') from dual;

SYS_CONTEXT('USERENV','MODULE')
--------------------------------------------------------------------------------
module_wang

http://blog.itpub.net/26736162/viewspace-2135626/

DBMS_APPLICATION_INFO是一个非常有用的程序包,他提供了通过V S E S S I O N 跟 踪 脚 本 运 行 情 况 的 能 力 , 该 包 允 许 你 在 v SESSION 跟踪脚本运行情况的能力,该包允许你在v SESSIONvsession中的如下三列中填值:
CLIENT_INFO,MODULE,ACTION,该包不仅提供了设置这些列值的过程,还提供了
返回这些列值的过程,在CLIENT_INFO列中适合存放允许你的程序的客户端信息,
MODULE列适合存放你的主程序名,如包的名称,ACTION列适合存放你的程序包中
的过程名,现在我们先简单了解一下DBMS_APPLICATION_INFO的和V$session相关
的函数:

dbms_application_info.set_client_info:允许你向v s e s s i o n 中 写 入 你 的 客 户 端 的 信 息 d b m s a p p l i c a t i o n i n f o . s e t m o d u l e : 允 许 你 向 v session中写入你的客户端的信息 dbms_application_info.set_module:允许你向v sessiondbmsapplicationinfo.setmodulevsession中写入你的主程序(如包)
和你的过程的名称
dbms_application_info.read_client_info:允许你从v s e s s i o n 中 读 取 客 户 端 的 信 息 d b m s a p p l i c a t i o n i n f o . r e a d m o d u l e : 允 许 你 从 v session中读取客户端的信息 dbms_application_info.read_module:允许你从v sessiondbmsapplicationinfo.readmodulevsession中读取主程序(如包)
和你的过程的名称

SYS@orclasm > desc dbms_application_info
PROCEDURE READ_CLIENT_INFO
Argument Name Type In/Out Default?


CLIENT_INFO VARCHAR2 OUT
PROCEDURE READ_MODULE
Argument Name Type In/Out Default?


MODULE_NAME VARCHAR2 OUT
ACTION_NAME VARCHAR2 OUT
PROCEDURE SET_ACTION
Argument Name Type In/Out Default?


ACTION_NAME VARCHAR2 IN
PROCEDURE SET_CLIENT_INFO
Argument Name Type In/Out Default?


CLIENT_INFO VARCHAR2 IN
PROCEDURE SET_MODULE
Argument Name Type In/Out Default?


MODULE_NAME VARCHAR2 IN
ACTION_NAME VARCHAR2 IN
PROCEDURE SET_SESSION_LONGOPS
Argument Name Type In/Out Default?


RINDEX BINARY_INTEGER IN/OUT
SLNO BINARY_INTEGER IN/OUT
OP_NAME VARCHAR2 IN DEFAULT
TARGET BINARY_INTEGER IN DEFAULT
CONTEXT BINARY_INTEGER IN DEFAULT
SOFAR NUMBER IN DEFAULT
TOTALWORK NUMBER IN DEFAULT
TARGET_DESC VARCHAR2 IN DEFAULT
UNITS VARCHAR2 IN DEFAULT

SYS@orclasm >

看一个简单的例子:

SQL> set serveroutput on
SQL>
SQL> DECLARE
2 l_clinent VARCHAR2(100);
3 l_mod_name VARCHAR2(100);
4 l_act_name VARCHAR2(100);
5 BEGIN
6 dbms_application_info.set_client_info(‘my client’);
7 dbms_application_info.read_client_info(l_clinent);
8 dbms_output.put_line(‘client=’||l_clinent);
9 dbms_application_info.set_module(‘my mod’,‘inserting’);
10 FOR i IN 1…100
11 LOOP
12 execute immediate ‘INSERT INTO pp_test(c1) VALUES(:X)’ USING i;
13 END LOOP;
14 dbms_application_info.read_module(l_mod_name,l_act_name);
15 dbms_output.put_line(‘mod_name=’||l_mod_name);
16 dbms_output.put_line(‘act_name=’||l_act_name);
17 END;
18
19 /

client=my client
mod_name=my mod
act_name=inserting

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL> select sid from v$mystat where rownum=1;

SID

1065

SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=1065;

SID SERIAL# CLIENT_INFO MODULE ACTION


1065 18968 my client my mod inserting

再看一个更有用的例子:

1.首先我们构建一个有大量数据的表:

SQL> DELETE FROM pp_test;

1320 rows deleted

SQL> insert into pp_test(c1) select object_name from all_objects;

116441 rows inserted

SQL> insert into pp_test(c1) select c1 from pp_test;

116441 rows inserted

SQL> insert into pp_test(c1) select c1 from pp_test;

232882 rows inserted

SQL> insert into pp_test(c1) select c1 from pp_test;

465764 rows inserted

SQL> commit;

Commit complete

2.我们现在需要更新PP_TEST表的C1列,在脚本执行过程中我们需要知道
已经处理的行数和已经花费的时间,执行结束后,我们需要知道处理的
总的行数和执行的总时间,使用如下代码:

–在session1中执行:
DECLARE
CURSOR cur_test IS
SELECT c1,ROWID
FROM pp_test;
l_new_c1 VARCHAR2(2000);
l_count_num PLS_INTEGER := 0;
l_start_time_num PLS_INTEGER;
BEGIN
l_start_time_num := DBMS_UTILITY.GET_TIME;
FOR cur_test_rec IN cur_test LOOP
l_count_num := l_count_num + 1;
l_new_c1 := cur_test_rec.c1||’_NEW’;
UPDATE pp_test
SET c1 = l_new_c1
WHERE rowid = cur_test_rec.ROWID;
IF MOD(l_count_num, 1000) = 0 THEN
DBMS_APPLICATION_INFO.SET_MODULE('Records Processed: ’ ||
l_count_num, ‘Elapsed: ’ || (DBMS_UTILITY.GET_TIME -
l_start_time_num)/100 || ’ sec’); --每更新1000行,记录一次执行时间
END IF;
END LOOP;
COMMIT;
DBMS_APPLICATION_INFO.SET_MODULE('Records Processed: ’ ||
l_count_num, ‘Elapsed: ’ || (DBMS_UTILITY.GET_TIME -
l_start_time_num)/100 || ’ sec’); --更新结束,记录总的执行时间
END;

执行过程中我们可以查询v$session,如下所示:

SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;

SID SERIAL# CLIENT_INFO MODULE ACTION


307 36536 Records Processed: 360000 Elapsed: 18.69 sec

SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;

SID SERIAL# CLIENT_INFO MODULE ACTION


307 36536 Records Processed: 626000 Elapsed: 32.99 sec

SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;

SID SERIAL# CLIENT_INFO MODULE ACTION


307 36536 Records Processed: 837000 Elapsed: 44.56 sec

执行结束,我们再次查询v$session:

SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;

SID SERIAL# CLIENT_INFO MODULE ACTION


307 36536 Records Processed: 931528 Elapsed: 49.86 sec

SQL>

Application developers can use the DBMS_APPLICATION_INFO package with Oracle Trace and the SQL trace facility to record names of executing modules or transactions in the database for later use when tracking the performance of various modules and debugging.

When an application registers with the database, its name and actions are recorded in the V S E S S I O N a n d V SESSION and V SESSIONandVSQLAREA views.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值