DBMS_SESSION包小議(四)

yangtingkun發表於2010-03-22

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

描述SET_IDENTIFIERCLEAR_IDENTIFIERCLOSE_DATABASE_LINKSET_EDITION_DEFERRED幾個簡單的過程。

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

 

 

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

使用DBMS_SESSION包可以設定當前會話的客戶端標識,利用這個方法可以更加輕鬆的在V$SESSION檢視中找到指定的會話:

SQL> SELECT SID, SERIAL#, CLIENT_IDENTIFIER
  2  FROM V$SESSION
  3  WHERE SID IN
  4  (SELECT SID     
  5  FROM V$MYSTAT
  6  WHERE ROWNUM = 1);

       SID    SERIAL# CLIENT_IDENTIFIER
---------- ---------- ----------------------------------------------------------------
       146       3579

SQL> EXEC DBMS_SESSION.SET_IDENTIFIER('MY_TEST')

PL/SQL 過程已成功完成。

SQL> SELECT SID, SERIAL#, CLIENT_IDENTIFIER
  2  FROM V$SESSION
  3  WHERE CLIENT_IDENTIFIER = 'MY_TEST';

       SID    SERIAL# CLIENT_IDENTIFIER
---------- ---------- ----------------------------------------------------------------
       146       3579 MY_TEST

使用CLEAR_IDENTIFIER過程可以清除客戶端標識的設定:

SQL> EXEC DBMS_SESSION.CLEAR_IDENTIFIER 

PL/SQL 過程已成功完成。

SQL> SELECT SID, SERIAL#, CLIENT_IDENTIFIER
  2  FROM V$SESSION
  3  WHERE SID = 146;

       SID    SERIAL# CLIENT_IDENTIFIER
---------- ---------- ----------------------------------------------------------------
       146       3579

CLOSE_DATABASE_LINK則與ALTER SESSION CLOSE DATABASE LINK語法的功能一樣,由於關閉當前會話開啟的資料庫鏈:

SQL> SELECT DB_LINK FROM USER_DB_LINKS;

DB_LINK
-----------------------------------------------------------------------
TEST112@TEST112

SQL> SELECT GLOBAL_NAME       
  2  FROM GLOBAL_NAME@TEST112@TEST112;

GLOBAL_NAME
-----------------------------------------------------------------------
TEST112

SQL> EXEC DBMS_SESSION.CLOSE_DATABASE_LINK('TEST112@TEST112')
BEGIN DBMS_SESSION.CLOSE_DATABASE_LINK('TEST112@TEST112'); END;

*
1 行出現錯誤:
ORA-02080:
資料庫連結正在使用中
ORA-06512:
"SYS.DBMS_SESSION", line 170
ORA-06512:
line 1


SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_SESSION.CLOSE_DATABASE_LINK('TEST112@TEST112')

PL/SQL 過程已成功完成。

這種方法是的使用者在PL/SQL語句中關閉資料庫鏈不再需要執行EXECUTE IMMEDIATE語句,而直接使用DBMS_SESSION包的CLOSE_DATABASE_LINK過程呼叫就可以了。

最後看一下SET_EDITION_DEFERRED過程。11gr2Oracle提供了版本的功能,可以透過ALTER SESSION來設定當前的版本,同樣在DBMS_SESSION包中,也增加了設定當前會話版本的功能:

SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_EDITION_NAME') FROM DUAL;

SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME')
-------------------------------------------------------------------------------------
ORA$BASE

SQL> SELECT * FROM ALL_EDITIONS;

EDITION_NAME                   PARENT_EDITION_NAME            USA
------------------------------ ------------------------------ ---
ORA$BASE                                                      YES
E_1                            ORA$BASE                       YES

SQL> EXEC DBMS_SESSION.SET_EDITION_DEFERRED('E_1')

PL/SQL 過程已成功完成。

SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_EDITION_NAME') FROM DUAL;

SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME')
------------------------------------------------------------------------------------
E_1

 

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

相關文章