无法从SYS_CONTEXT读取值

时间:2011-11-25 12:28:18

标签: oracle web-applications jdbc plsql oracle-sqldeveloper

我有一个PL / SQL过程,它在用户会话中设置一些变量,如下所示: -

Dbms_Session.Set_Context(
    NAMESPACE =>'MY_CTX',
    ATTRIBUTE => 'FLAG_NAME',
    Value => 'some value');

在此之后(在相同的过程中),我尝试使用以下方法读取此标志的值: -

SYS_CONTEXT('MY_CTX', 'FLAG_NAME');

以上都没有回报。 DB如何失去这个价值?更奇怪的部分是,如果我直接从Oracle SQL Developer调用此proc,那么它可以工作。当我从可调用语句从我的Web应用程序调用此proc时,它不起作用。

- 编辑 -

添加了一个关于我们如何从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();

1 个答案:

答案 0 :(得分:2)

以下是您的方案的简约实现:

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> 

因此,问题必须存在于您的代码中。您需要检查程序以查找问题。或者,在此处发布整个样本。请确保它是可能的最小工作测试用例。我们谁都不想筛选数百行寻找bug的shonky source。我们用自己的代码得到了足够的信息:)