Невозможно прочитать значение из SYS_CONTEXT - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть процедура PL / SQL, которая устанавливает некоторую переменную в сеансе пользователя, например: -

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

Сразу после этого (в той же процедуре) я пытаюсь прочитать значение этогофлаг, используя: -

SYS_CONTEXT('MY_CTX', 'FLAG_NAME');

Выше ничего не возвращает.Как БД потеряла это значение?Более странная часть заключается в том, что если я вызываю этот процесс напрямую из Oracle SQL Developer, он работает.Это не работает, когда я вызываю этот процесс из моего веб-приложения из вызываемого оператора.

- EDIT -

Добавлен пример того, как мы вызываемпроцесс из нашего кода Java.

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 Ответ

2 голосов
/ 25 ноября 2011

Вот минималистичная реализация вашего сценария:

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> 

Итак, проблема должна лежать где-то в вашем коде.Вам нужно будет изучить вашу программу в поисках проблемы.Кроме того, вы можете опубликовать весь образец здесь.Пожалуйста, убедитесь, что это наименьший возможный тестовый случай .Никто из нас не хочет просеивать сотни строк в поисках ошибки.Мы получаем достаточно с нашим собственным кодом:)

...