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中讀取主程式(如包)
和你的過程的名稱
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$SESSION and V$SQLAREA views.
[@more@]
from:http://www.psoug.org/reference/dbms_applic_info.html
|
About Me
...............................................................................................................................
● 本文整理自網路:http://blog.csdn.net/zhpsam109/article/details/3716373、http://blog.itpub.net/271283/viewspace-997571/
● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新
● 本文pdf版及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/
● QQ群:230161599 微信群:私聊
● 聯絡我請加QQ好友(642808185),註明新增緣由
● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解
● 版權所有,歡迎分享本文,轉載請保留出處
...............................................................................................................................
拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2135626/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- fmt包的使用
- Nodemon包的使用
- Go標準包——net/rpc包的使用GoRPC
- 包裝類的使用
- npm包:moment的使用NPM
- net/rpc包的使用RPC
- Go | 閉包的使用Go
- gitmoji表情包使用--github的專屬表情包Github
- 使用PyCharm引入需要使用的包PyCharm
- 閉包的錯誤使用
- Composer 包使用
- flag 包使用
- js閉包及閉包的經典使用場景JS
- 最安全的SRM錢包,SRM冷錢包使用教程
- 最安全的PMEER錢包,PMEER冷錢包使用教程
- JS閉包的簡易使用JS
- npm包serve的簡單使用NPM
- Javaparse包的使用和講解Java
- 使用JSPWiki豐富Unity-UPM包的使用JSUnity
- iproute2工具包的使用
- Go 中 io 包的使用方法Go
- critters 開發包的使用案例分享
- 關於GJSON包的簡單使用JSON
- 標準庫 fmt 包的基本使用
- 從1開始的PHPStorm+Xdebug包搭建不包使用教程PHPORM
- 06、使用Gradle構建的專案如何打jar包和war包GradleJAR
- 安全係數最高的BSV錢包,BSV冷錢包使用圖文
- golang toolkits包的使用方法介紹Golang
- javascript閉包的使用–按鈕切換JavaScript
- 閉包的使用-高頻事件優化事件優化
- 使用 Got包的一些體會Go
- npm包:js-cookie的簡單使用NPMJSCookie
- 【Buildroot】工具包使用UI
- vscode外掛使用包VSCode
- 使用npm包-Vant WeappNPMAPP
- Jacob包使用方法
- Netty2:粘包/拆包問題與使用LineBasedFrameDecoder的解決方案Netty
- wireshark安裝使用與tcpdump的抓包分析TCP
- 最新使用Charles進行HTTPS抓包的方法HTTP