DBMS_SESSION包小议(八)

除了使用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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-630724/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值