Как обеспечить глобальный межсессионный контекст -- одна переменная на все сессии?
Нужно предотвратить повторный запуск пакетной процедуры. Но не хочу использовать флаг текущего запуска в таблице, хотелось бы брать из памяти. Насколько понял из документации, глобальный контекст доступен только в рамках конкретной сессии.
А как можно обеспечить межсессионное взаимодействие каким-нибудь простым изящным способом?
То есть одна переменная на все сессии.
Ответы (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.