重庆思庄Oracle、Redhat认证学习论坛
标题:
使用DBMS_APPLICATION_INFO包
[打印本页]
作者:
郑全
时间:
2014-12-24 10:24
标题:
使用DBMS_APPLICATION_INFO包
DBMS_APPLICATION_INFO是一个非常有用的程序包,他提供了通过V$SESSION
跟踪脚本运行情况的能力,该包允许你在v$session中的如下三列中填值:
CLIENT_INFO,MODULE,ACTION,该包不仅提供了设置这些列值的过程,还提供了
返回这些列值的过程,在CLIENT_INFO列中适合存放允许你的程序的客户端信息,
MODULE列适合存放你的主程序名,如包的名称,ACTION列适合存放你的程序包中
的过程名,现在我们先简单了解一下DBMS_APPLICATION_INFO的和V$session相关
的函数:
dbms_application_info.set_client_info:允许你向v$session中写入你的客户端的信息
dbms_application_info.set_module:允许你向v$session中写入你的主程序(如包)
和你的过程的名称
dbms_application_info.read_client_info:允许你从v$session中读取客户端的信息
dbms_application_info.read_module:允许你从v$session中读取主程序(如包)
和你的过程的名称
看一个简单的例子:
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>
欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2