Oracle RESET_PACKAGE 不重置会话中变量的值

Oracle RESET_PACKAGE does not reset value of a variable in the session

我有一个 JDBC 连接被合并的应用程序。这也和我的question. For simplicity let's assume I have 1 connection and I need to set a variable then reset session / context state. However the idea is not reverse / reset the 'app1_ctx' variable particularly as in the actual case users can enter many procedures that set many variables so what I need is one procedure that clears all session related variables or even restart session. (please check this question有关,无法理解问题)

下面是我的程序:

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' );

您需要向 clear_all_context 传递与作为第一个参数传递给 set_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_packagemodify_package_state