DBMS_SESSION包小議(七)

yangtingkun發表於2010-03-28

除了使用ALTER SESSION設定會話的狀態,利用V$SESSION查詢會話狀態,Oracle還提供了PL/SQL介面DBMS_SESSION來查詢和設定會話相關的狀態。

描述RESET_PACKAGEMODIFY_PACKAGE_STATE過程。

DBMS_SESSION包小議(一):http://yangtingkun.itpub.net/post/468/498365

DBMS_SESSION包小議(二):http://yangtingkun.itpub.net/post/468/498408

DBMS_SESSION包小議(三):http://yangtingkun.itpub.net/post/468/498451

DBMS_SESSION包小議(四):http://yangtingkun.itpub.net/post/468/498475

DBMS_SESSION包小議(五):http://yangtingkun.itpub.net/post/468/498559

DBMS_SESSION包小議(六):http://yangtingkun.itpub.net/post/468/498666

 

 

一般來說設定會話級的狀態都是透過ALTER SESSION語句,也有個別的例外,比如角色的設定是透過SET語句實現的。Oracle除了提供SQL的方法外,還提供了PL/SQL的介面,DBMS_SESSION包,將會話狀態的設定和查詢整合在這個包中。

其實RESET_PACKAGE過程可以由MODIFY_PACKAGE_STATE過程代替,MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES)就等價於RESET_PACKAGE,利用這個過程可以清除會話中開啟的所有的包的狀態,包括包中的變數會被重置,遊標會被關閉。而對於MODIFY_PACKAGE_STATE(DBMS_SESSION.REINITIALIZE)則同樣會重新初始化所有的變數,但是包分配的內容並不會釋放,而是直接重用,包括遊標雖然被關閉,但是仍然保留在快取中,因此使用後者一般具有更好的效能。

看一個簡單的例子來說明這個過程的功能:

SQL> CREATE OR REPLACE PACKAGE PA_TEST AS
  2     GV_NUM NUMBER;
  3     GV_DATE DATE;
  4     PROCEDURE P_DISPLAY;
  5  END;
  6  /

程式包已建立。

SQL> CREATE OR REPLACE PACKAGE BODY PA_TEST AS
  2 
  3     PROCEDURE P_DISPLAY AS
  4     BEGIN
  5             DBMS_OUTPUT.PUT_LINE('GV_NUM:' || GV_NUM);
  6             DBMS_OUTPUT.PUT_LINE('GV_DATE:' || TO_CHAR(GV_DATE, 'YYYY-MM-DD HH24:MI:SS'));
  7     END;
  8 
  9  BEGIN
 10     GV_NUM := 1;
 11     GV_DATE := SYSDATE;
 12 
 13     DBMS_LOCK.SLEEP(5);
 14  END;
 15  /

程式包體已建立。

SQL> SET SERVEROUT ON
SQL> SET TIMING ON
SQL> EXEC PA_TEST.P_DISPLAY
GV_NUM:1
GV_DATE:2010-03-29 06:31:06

PL/SQL 過程已成功完成。

已用時間:  00: 00: 05.01
SQL> EXEC PA_TEST.P_DISPLAY
GV_NUM:1
GV_DATE:2010-03-29 06:31:06

PL/SQL 過程已成功完成。

已用時間:  00: 00: 00.00

包在第一個被呼叫時,要進行初始化,而再次呼叫就不需要了。

當執行了MODIFY_PACKAGE_STATE過程後,再次呼叫包的過程,就會發現這個包還需要重新初始化:

SQL> EXEC DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.REINITIALIZE)

PL/SQL 過程已成功完成。

已用時間:  00: 00: 00.01
SQL> EXEC PA_TEST.P_DISPLAY

PL/SQL 過程已成功完成。

已用時間:  00: 00: 05.00
SQL> SET SERVEROUT ON
SQL> EXEC PA_TEST.P_DISPLAY
GV_NUM:1
GV_DATE:2010-03-29 06:34:25

PL/SQL 過程已成功完成。

已用時間:  00: 00: 00.01

從上面的結果看到,不僅PA_TEST包被重置,連DBMS_OUTPUT包的狀態也被重置,必須重新SET SERVEROUT ON,否則DBMS_OUTPUT無法輸出結果到螢幕。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-630590/,如需轉載,請註明出處,否則將追究法律責任。

相關文章