昨天一個朋友問我如何監測一個PL/SQL的健全狀態,這裡簡單介紹幾種方法。
介紹專業一點的DBMS_APPLICATION_INFO包。
上一篇介紹了通過INSERT和自治事務的解決方案,方法很簡單,但是需要輔助的表和過程,而且這種方法顯得有點不夠專業。
那麼這裡介紹一篇相對PROFESSIONAL的解決方案,Oracle提供的DBMS_APPLICATION_INFO包:
SQL> SELECT SID, ACTION
2 FROM V$SESSION
3 WHERE SID IN
4 (SELECT SID
5 FROM V$MYSTAT
6 WHERE ROWNUM = 1);
SID ACTION
---------- --------------------------------
13
SQL> BEGIN
2 DBMS_APPLICATION_INFO.SET_ACTION('STEP A');
3 DBMS_LOCK.SLEEP(10);
4 DBMS_APPLICATION_INFO.SET_ACTION('STEP B');
5 DBMS_LOCK.SLEEP(10);
6 DBMS_APPLICATION_INFO.SET_ACTION('STEP C');
7 END;
8 /
PL/SQL過程已成功完成。
通過簡單的調用SET_ACTION過程,其他會話就可以通過監測V$SESSION視圖,而從得到當前的PL/SQL執行到哪個步驟:
SQL> SELECT SID, ACTION FROM V$SESSION WHERE SID = 13;
SID ACTION
---------- --------------------------------
13 STEP A
SQL> SELECT SID, ACTION FROM V$SESSION WHERE SID = 13;
SID ACTION
---------- --------------------------------
13 STEP A
SQL> SELECT SID, ACTION FROM V$SESSION WHERE SID = 13;
SID ACTION
---------- --------------------------------
13 STEP B
SQL> SELECT SID, ACTION FROM V$SESSION WHERE SID = 13;
SID ACTION
---------- --------------------------------
13 STEP B
SQL> SELECT SID, ACTION FROM V$SESSION WHERE SID = 13;
SID ACTION
---------- --------------------------------
13 STEP C
SQL> SELECT SID, ACTION FROM V$SESSION WHERE SID = 13;
SID ACTION
---------- --------------------------------
13 STEP C
在另外的會話可以看到,剛才會話的PL/SQL從STEP A到STEP C的變化。需要注意,如果會話不再修改ACTION,那麼這個會話的ACTION會一直保持到會話的結束。
更多精彩內容:http://www.bianceng.cn/database/Oracle/
這種方法的簡單程度一點都不必INSERT的方法複雜,而且DBMS_APPLICATION_INFO包是所有使用者都可以訪問的。但是需要注意,並不是所有使用者都可以訪問V$SESSION視圖的,這個視圖需要額外的授權。
上面的方法似乎還不是很專業,利用這個包還有更專業的解決方案:
SQL> SELECT SID, SERIAL#
2 FROM V$SESSION
3 WHERE SID IN
4 (SELECT SID
5 FROM V$MYSTAT
6 WHERE ROWNUM = 1);
SID SERIAL#
---------- ----------
13 6610
SQL> DECLARE
2 V_ID BINARY_INTEGER := DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS_NOHINT;
3 V_SLNO BINARY_INTEGER;
4 V_TOTALWORK NUMBER := 5;
5 BEGIN
6 FOR I IN 1..V_TOTALWORK LOOP
7 DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS(
8 V_ID,
9 V_SLNO,