我有一个应用程序,其中JDBC连接池。这与我的问题有关。为简单起见,让我们假设我有一个连接,我需要设置一个变量,然后重置会话/上下文状态。然而,这个想法并不是反转/重置'app1_ctx'变量,特别是在实际情况下,用户可以输入许多设置许多变量的过程,所以我需要的是一个过程,清除所有会话相关的变量,甚至重新启动会话。(请也检查这个问题以了解问题)
下面是我的步骤:CREATE OR REPLACE CONTEXT app1_ctx USING app1_ctx_package;
CREATE OR REPLACE PACKAGE app1_ctx_package IS
PROCEDURE set_empno (empno NUMBER);
END;
CREATE OR REPLACE PACKAGE BODY app1_ctx_package IS
PROCEDURE set_empno (empno NUMBER) IS
BEGIN
DBMS_SESSION.SET_CONTEXT('app1_ctx', 'empno', empno);
END;
END;
检查'empno'值时:
select SYS_CONTEXT ('app1_ctx', 'empno') employee_num from dual;
我得到employee_num = null
要设置empno变量,我们运行以下命令:
begin
APP1_CTX_PACKAGE.SET_EMPNO(11);
end;
然后当重新检查'empno'的值时,我得到employee_num = 11
我们需要的是清除之后的所有会话/包变量。
我尝试使用RESET_PACKAGE或下面类似的过程来清除会话变量。
begin
DBMS_SESSION.RESET_PACKAGE;
end;
begin
DBMS_SESSION.modify_package_state(DBMS_SESSION.reinitialize);
end;
begin
DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES);
end;
但是当重新检查变量时,它仍然是相同的值。
我怎样才能做到这一点?
我不确定如何使用CLEAR_ALL_CONTEXT过程。
dbms_session.clear_all_context( 'app1_ctx' );
您需要将作为第一个参数传递给set_context
的相同名称空间传递给clear_all_context
。
如果你不知道应用程序使用的所有上下文但你知道它使用的所有模式
for ctx in (select *
from dba_context
where schema in (<<schemas your application uses>>))
loop
dbms_session.clear_all_context( ctx.namespace );
end loop;
在本例中,没有包变量,因此不需要调用reset_package
或modify_package_state
。