除了使用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_CONTEXT或CLEAR_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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-630724/