DBMS_SESSION包小议(七)

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

描述RESET_PACKAGEMODIFY_PACKAGE_STATE过程。

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

 

 

一般来说设置会话级的状态都是通过ALTER SESSION语句,也有个别的例外,比如角色的设置是通过SET语句实现的。Oracle除了提供SQL的方法外,还提供了PL/SQL的接口,DBMS_SESSION包,将会话状态的设置和查询集成在这个包中。

其实RESET_PACKAGE过程可以由MODIFY_PACKAGE_STATE过程代替,MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES)就等价于RESET_PACKAGE,利用这个过程可以清除会话中打开的所有的包的状态,包括包中的变量会被重置,游标会被关闭。而对于MODIFY_PACKAGE_STATE(DBMS_SESSION.REINITIALIZE)则同样会重新初始化所有的变量,但是包分配的内容并不会释放,而是直接重用,包括游标虽然被关闭,但是仍然保留在缓存中,因此使用后者一般具有更好的性能。

看一个简单的例子来说明这个过程的功能:

SQL> CREATE OR REPLACE PACKAGE PA_TEST AS
  2     GV_NUM NUMBER;
  3     GV_DATE DATE;
  4     PROCEDURE P_DISPLAY;
  5  END;
  6  /

程序包已创建。

SQL> CREATE OR REPLACE PACKAGE BODY PA_TEST AS
  2 
  3     PROCEDURE P_DISPLAY AS
  4     BEGIN
  5             DBMS_OUTPUT.PUT_LINE('GV_NUM:' || GV_NUM);
  6             DBMS_OUTPUT.PUT_LINE('GV_DATE:' || TO_CHAR(GV_DATE, 'YYYY-MM-DD HH24:MI:SS'));
  7     END;
  8 
  9  BEGIN
 10     GV_NUM := 1;
 11     GV_DATE := SYSDATE;
 12 
 13     DBMS_LOCK.SLEEP(5);
 14  END;
 15  /

程序包体已创建。

SQL> SET SERVEROUT ON
SQL> SET TIMING ON
SQL> EXEC PA_TEST.P_DISPLAY
GV_NUM:1
GV_DATE:2010-03-29 06:31:06

PL/SQL 过程已成功完成。

已用时间:  00: 00: 05.01
SQL> EXEC PA_TEST.P_DISPLAY
GV_NUM:1
GV_DATE:2010-03-29 06:31:06

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00

包在第一个被调用时,要进行初始化,而再次调用就不需要了。

当执行了MODIFY_PACKAGE_STATE过程后,再次调用包的过程,就会发现这个包还需要重新初始化:

SQL> EXEC DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.REINITIALIZE)

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
SQL> EXEC PA_TEST.P_DISPLAY

PL/SQL 过程已成功完成。

已用时间:  00: 00: 05.00
SQL> SET SERVEROUT ON
SQL> EXEC PA_TEST.P_DISPLAY
GV_NUM:1
GV_DATE:2010-03-29 06:34:25

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01

从上面的结果看到,不仅PA_TEST包被重置,连DBMS_OUTPUT包的状态也被重置,必须重新SET SERVEROUT ON,否则DBMS_OUTPUT无法输出结果到屏幕。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-630590/,如需转载,请注明出处,否则将追究法律责任。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值