除了使用ALTER SESSION设置会话的状态,利用V$SESSION查询会话状态,Oracle还提供了PL/SQL接口DBMS_SESSION来查询和设置会话相关的状态。
描述RESET_PACKAGE和MODIFY_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博客 ” ,链接:https://blog.itpub.net/4227/viewspace-630590/ ,如需转载,请注明出处,否则将追究法律责任。