Как обеспечить глобальный межсессионный контекст -- одна переменная на все сессии?

Нужно предотвратить повторный запуск пакетной процедуры. Но не хочу использовать флаг текущего запуска в таблице, хотелось бы брать из памяти. Насколько понял из документации, глобальный контекст доступен только в рамках конкретной сессии.

А как можно обеспечить межсессионное взаимодействие каким-нибудь простым изящным способом?

То есть одна переменная на все сессии.


Ответы (1 шт):

Автор решения: 0xdb

глобальный контекст доступен только в рамках конкретной сессии

Не совсем так, добавив клаузу ACCESSED GLOBALLY контекст станет доступен во всех сессиях.

Вот посмотрите (или попробуйте):

create or replace context gctx using gpack accessed globally
/
create or replace package gpack as
    function getnamespace return varchar2;
    procedure setctx (attr varchar2, value varchar2);
    procedure clearctx (attr varchar2); 
end;
/
create or replace package body gpack as
    function getnamespace return varchar2 is begin return 'gctx'; end;
    procedure setctx (attr varchar2, value varchar2) is
    begin
        dbms_session.set_context (namespace=>getnamespace, attribute=>attr, value=>value);
    end;
    procedure clearctx (attr varchar2) is
    begin
        dbms_session.clear_context (namespace=>getnamespace, attribute=>attr);
    end;
end;
/

В сессии А:

select sys_context ('userenv', 'sessionid') sid from dual
/
SID
------
639285

exec gpack.setctx ('something', 'lock') 

select sys_context (gpack.getnamespace, 'something') something from dual;

SOMETHING
---------
lock

В сессии Б:

select sys_context ('userenv', 'sessionid') sid from dual
/
SID
--------------------------------------------------------------------------------
639321

select sys_context (gpack.getnamespace, 'something') something from dual
/
SOMETHING
--------------------------------------------------------------------------------
lock

Подробнее в гл. документации Global Application Contexts.

→ Ссылка