ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DBMS_SESSION包小议(四)

DBMS_SESSION包小议(四)

原创 Linux操作系统 作者:yangtingkun 时间:2010-03-22 22:13:53 0 删除 编辑

除了使用ALTER SESSION设置会话的状态,利用V$SESSION查询会话状态,Oracle还提供了PL/SQL接口DBMS_SESSION来查询和设置会话相关的状态。

描述SET_IDENTIFIER、CLEAR_IDENTIFIER、CLOSE_DATABASE_LINK和SET_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过程。11gr2中Oracle提供了版本的功能,可以通过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博客 ” ,链接:https://blog.itpub.net/4227/viewspace-630128/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11077319