DBMS_SESSION包小議(八)

yangtingkun發表於2010-03-29

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

描述CONTEXT相關的過程。

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

DBMS_SESSION包小議(七):http://yangtingkun.itpub.net/post/468/498676

 

 

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

會話可以設定上下文資訊,比如在VDB中,就會利用上下文來獲取必要的資訊。

SQL> CREATE OR REPLACE CONTEXT MY_CONTEXT USING P_TEST;

上下文已建立。

SQL> CREATE OR REPLACE PACKAGE P_TEST AS
  2     PROCEDURE P_SET;
  3  END;
  4  /

程式包已建立。

SQL> CREATE OR REPLACE PACKAGE BODY P_TEST AS
  2 
  3     PROCEDURE P_SET AS
  4     BEGIN
  5             DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR1', '10');
  6             DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR2', '50');
  7             DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR3', '100');
  8     END;
  9  END;
 10  /

程式包體已建立。

SQL> EXEC P_TEST.P_SET

PL/SQL 過程已成功完成。

下面透過LIST_CONTEXT過程檢查上下文設定結果:

SQL> SET SERVEROUT ON SIZE 100000
SQL> DECLARE
  2     V_LIST DBMS_SESSION.APPCTXTABTYP;
  3     V_NUM NUMBER;
  4  BEGIN
  5     DBMS_SESSION.LIST_CONTEXT(V_LIST, V_NUM);
  6     FOR I IN 1..V_NUM LOOP
  7             DBMS_OUTPUT.PUT_LINE('NAMESPACE:' || V_LIST(I).NAMESPACE
  8                     || ', ATTRIBUTE:' || V_LIST(I).ATTRIBUTE
  9                     || ', VALUE:' || V_LIST(I).VALUE);
 10     END LOOP;
 11  END;
 12  /
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR3, VALUE:100
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR2, VALUE:50
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR1, VALUE:10

PL/SQL 過程已成功完成。

利用CLEAR_CONTEXT清除上下文設定:

SQL> CREATE OR REPLACE PACKAGE P_TEST AS
  2     PROCEDURE P_SET;
  3     PROCEDURE P_CLEAR;
  4     PROCEDURE P_CLEAR_ALL;
  5  END;
  6  /

程式包已建立。

SQL> CREATE OR REPLACE PACKAGE BODY P_TEST AS
  2 
  3     PROCEDURE P_SET AS
  4     BEGIN
  5             DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR1', '10');
  6             DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR2', '50');
  7             DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR3', '100');
  8     END;
  9 
 10     PROCEDURE P_CLEAR AS
 11     BEGIN
 12             DBMS_SESSION.CLEAR_CONTEXT('MY_CONTEXT', NULL, 'ATTR2');
 13     END;
 14 
 15     PROCEDURE P_CLEAR_ALL AS
 16     BEGIN
 17             DBMS_SESSION.CLEAR_ALL_CONTEXT('MY_CONTEXT');
 18     END;
 19  END;
 20  /

程式包體已建立。

SQL> EXEC P_TEST.P_CLEAR

PL/SQL 過程已成功完成。

SQL> DECLARE
  2     V_LIST DBMS_SESSION.APPCTXTABTYP;
  3     V_NUM NUMBER;
  4  BEGIN
  5     DBMS_SESSION.LIST_CONTEXT(V_LIST, V_NUM);
  6     FOR I IN 1..V_NUM LOOP
  7             DBMS_OUTPUT.PUT_LINE('NAMESPACE:' || V_LIST(I).NAMESPACE
  8                     || ', ATTRIBUTE:' || V_LIST(I).ATTRIBUTE
  9                     || ', VALUE:' || V_LIST(I).VALUE);
 10     END LOOP;
 11  END;
 12  /
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR3, VALUE:100
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR1, VALUE:10

PL/SQL 過程已成功完成。

SQL> EXEC P_TEST.P_CLEAR_ALL

PL/SQL 過程已成功完成。

SQL> DECLARE
  2     V_LIST DBMS_SESSION.APPCTXTABTYP;
  3     V_NUM NUMBER;
  4  BEGIN
  5     DBMS_SESSION.LIST_CONTEXT(V_LIST, V_NUM);
  6     FOR I IN 1..V_NUM LOOP
  7             DBMS_OUTPUT.PUT_LINE('NAMESPACE:' || V_LIST(I).NAMESPACE
  8                     || ', ATTRIBUTE:' || V_LIST(I).ATTRIBUTE
  9                     || ', VALUE:' || V_LIST(I).VALUE);
 10     END LOOP;
 11  END;
 12  /

PL/SQL 過程已成功完成。

需要注意,在建立上下文的時候指定了PACKAGE,此後設定上下文或清除上下文設定都需要透過這個包的過程來完成,如果直接嘗試呼叫SET_CONTEXTCLEAR_CONTEXT則會報錯許可權不足:

SQL> EXEC DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'A', '50')
BEGIN DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'A', '50'); END;

*
1 行出現錯誤:
ORA-01031:
許可權不足
ORA-06512:
"SYS.DBMS_SESSION", line 101
ORA-06512:
line 1

SQL> EXEC DBMS_SESSION.CLEAR_CONTEXT('MY_CONTEXT', NULL, 'ATTR2')
BEGIN DBMS_SESSION.CLEAR_CONTEXT('MY_CONTEXT', NULL, 'ATTR2'); END;

*
1 行出現錯誤:
ORA-01031:
許可權不足
ORA-06512:
"SYS.DBMS_SESSION", line 115
ORA-06512:
line 1

 

 

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

相關文章