我有一个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();
答案 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。我们用自己的代码得到了足够的信息:)