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