Java Oracle RESET_包不会重置会话中变量的值

Java Oracle RESET_包不会重置会话中变量的值,java,oracle,jdbc,plsql,connection-pooling,Java,Oracle,Jdbc,Plsql,Connection Pooling,我有一个JDBC连接池的应用程序。这与我的工作有关。为了简单起见,假设我有一个连接,我需要设置一个变量,然后重置会话/上下文状态。但是,我们的想法不是反转/重置“app1_ctx”变量,特别是在实际情况下,用户可以输入设置许多变量的许多过程,因此我需要的是一个清除所有会话相关变量甚至重新启动会话的过程。请检查此项以了解问题 以下是我的程序: CREATE OR REPLACE CONTEXT app1_ctx USING app1_ctx_package; CREATE OR REPLACE P

我有一个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

我们需要的是在此之后清除所有会话/包变量

我尝试使用或下面类似的过程清除会话变量

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;
但是,当重新检查变量时,它仍然具有相同的值

我怎样才能做到这一点

我不知道如何使用这个程序

dbms_session.clear_all_context( 'app1_ctx' );
您需要传递相同的名称空间来清除作为设置\u上下文的第一个参数传递的所有\u上下文

如果您不知道应用程序使用的所有上下文,但知道它使用的所有模式

for ctx in (select * 
              from dba_context
             where schema in (<<schemas your application uses>>))
loop
  dbms_session.clear_all_context( ctx.namespace );
end loop;

在本例中,没有包变量,因此无需调用重置包或修改包状态。

感谢您的解释。我已经编辑了问题,请检查第一段。我需要的是一个清除所有会话状态或相关变量或重新启动/启动会话的常规过程。在实际的应用程序用例中,用户可以输入多个过程来更改多个变量,我们需要实现的是在用户完成重置会话状态后运行一个命令,以便池连接的未来使用不受会话中此更改的影响variable@SelimAlawwa-是否存在多个上下文?对于应用程序来说,这有点不寻常。您可以迭代dba_上下文以查看应用程序创建的所有上下文,然后为每个上下文调用clear_all_上下文。您几乎肯定不想在dba_上下文中的每个上下文上调用clear_all_上下文,因为SYS和其他管理模式中有一个数字您几乎肯定不想触及。我们的应用程序使用tomcat jdbc池,因此客户端之间的连接可以重复使用。我们希望在每个客户端完成连接后清除会话,然后再将其用于另一个客户端。每个客户端可以设置1个或多个不同的变量。他可以键入任何sql/过程并执行它。请检查[和][为了理解用例。所以希望使用一个通用过程来重置任何会话相关变量的值。或者如果可能的话重新启动会话。如果我迭代dba_上下文,我可以知道哪些是用户定义的上下文吗?@SelimAlawwa-我知道你在使用连接池。但是客户端可能不会动态地随机创建新上下文st表示他们不会动态创建新表。因此会有一个应用程序使用的上下文列表。大多数应用程序使用0。在使用上下文的应用程序中,绝大多数使用1。dba_上下文包括拥有上下文的模式,因此假设您知道与应用程序相关联的模式,通常可以1缩小名单。