【问题标题】:Cannot read value from SYS_CONTEXT无法从 SYS_CONTEXT 读取值
【发布时间】: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


【解决方案1】:

这是您的场景的简约实现:

create or replace package my_ctx
as
    procedure set_flag_name (str varchar2);
    function get_flag_name return varchar2;
end my_ctx;
/

create or replace package body my_ctx
as
    procedure set_flag_name (str varchar2)
    is
    begin
        dbms_session.set_context(
            NAMESPACE =>'MY_CTX',
            ATTRIBUTE => 'FLAG_NAME',
            Value => str);
    end set_flag_name;

    function get_flag_name return varchar2
    is
    begin
        return SYS_CONTEXT('MY_CTX', 'FLAG_NAME');
    end get_flag_name;
end my_ctx;
/

如您所见,它有效:

SQL> exec my_ctx.set_flag_name('Jolly Roger')

PL/SQL procedure successfully completed.

SQL> select my_ctx.get_flag_name from dual
  2  /

GET_FLAG_NAME
--------------------------------------------------------------------------------
Jolly Roger

SQL> 

因此,问题一定存在于您的代码中。您将需要检查您的程序以查找问题。或者,在此处发布整个示例。请确保它是可能的最小工作测试用例。我们谁都不想筛选数百行不可靠的源代码来寻找错误。我们用自己的代码就够了:)

【讨论】:

  • 抱歉,我无法发布我的代码,但您能否建议一些可能无法使用的场景,我可以进行测试以确定哪个适用于它?
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 2020-10-16
  • 2019-03-11
  • 2018-05-05
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多