【发布时间】:2012-09-23 04:33:45
【问题描述】:
Oracle 上的数据库连接可以具有在连接的生命周期内持续存在的会话状态,即以包变量的形式。
有没有办法在连接期间刷新/清除调用之间的所有状态,而不会终止连接并重新建立新连接。
即考虑首先在包 init 中设置的包变量,然后在该包中的某个过程中进行修改:如何“重置”包,以便从 1 个连接对过程的多次调用总是导致重新初始化包?
一般来说:如何在该连接上从客户端执行语句之间“重置”任何会话状态?
【问题讨论】:
Oracle 上的数据库连接可以具有在连接的生命周期内持续存在的会话状态,即以包变量的形式。
有没有办法在连接期间刷新/清除调用之间的所有状态,而不会终止连接并重新建立新连接。
即考虑首先在包 init 中设置的包变量,然后在该包中的某个过程中进行修改:如何“重置”包,以便从 1 个连接对过程的多次调用总是导致重新初始化包?
一般来说:如何在该连接上从客户端执行语句之间“重置”任何会话状态?
【问题讨论】:
dbms_session.reset_package 是我能想到的最接近的。看到这个tahiti link。
【讨论】:
DBMS_SESSION.RESET_PACKAGE() 和DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES) 一样,但也有DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.REINITIALIZE) 不释放资源(性能受到影响),而是重新初始化数据。太好了。
除了重置所有包的dbms_session.reset_package(在 René Nyffenegger 的回答中提出)之外,您必须编写自己的包过程来仅重置单个包的状态。该过程只会将所有包变量设置为 NULL(或任何适当的值)。
【讨论】: