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_package
或 modify_package_state
。
我有一个 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_package
或 modify_package_state
。