【发布时间】:2012-01-06 08:03:52
【问题描述】:
我有一个 PL/SQL 过程,它在用户会话中设置一些变量,如下所示:-
Dbms_Session.Set_Context(
NAMESPACE =>'MY_CTX',
ATTRIBUTE => 'FLAG_NAME',
Value => 'some value');
在这之后(在相同的过程中),我尝试读取这个标志的值,使用:-
SYS_CONTEXT('MY_CTX', 'FLAG_NAME');
上面没有返回任何内容。数据库是如何失去这个价值的?更奇怪的是,如果我直接从 Oracle SQL Developer 调用这个过程,那么它就可以工作。当我从可调用语句中的 Web 应用程序调用此过程时,它不起作用。
--编辑--
添加了一个关于我们如何从 Java 代码调用 proc 的示例。
String statement = "Begin package_name.proc_name( flag_val => :1); END;";
OracleCallableStatement st = <some object by some framework>
.createCallableStatement(statement);
st.setString(1, 'flag value');
st.execute();
st.close();
【问题讨论】:
-
对sys_context的查询是在同一个tx阶段吗?您的应用服务器是使用专用的还是共享的服务器进程?
-
我不知道,但是该值已设置并且正在以相同的 proc 方法读取。似乎没有设置,但我没有得到任何 SQL 异常。
-
您是否在同一个通话中设置和阅读?您在 SQLDeveloper 测试和应用服务器测试中使用相同的帐户吗?
-
对于 web 应用程序和 sqldeveloper,我使用相同的用户名和架构。我在同一个过程中设置和读取,所以是的,它发生在同一个调用中。
-
@AppleGrew 上下文值将保留,直到您关闭 jdbc 连接。我认为由于您关闭了连接,因此上下文值为 null。
标签: oracle web-applications jdbc plsql oracle-sqldeveloper