Есть ли способ получить информацию о текущем сеансе из gv$session в oracle?
Есть ли способ однозначно идентифицировать текущий сеанс в GV$SESSION
посмотреть в Oracle?
Я столкнулся с проблемой, что следующий запрос может вернуть более одной строки в случае конфигурации Oracle RAC:
SELECT SID, SERIAL#
FROM GV$SESSION
WHERE AUDSID = Sys_Context('USERENV', 'SESSIONID')
AND SID = Sys_Context('USERENV', 'SID');
С помощью V$MYSTAT
это тоже не вариант, потому что V$MYSTAT
может быть недоступно для текущего сеанса (например, когда статистика отключена).
3 ответа
Попробуй это:
SELECT SID, SERIAL#
FROM V$SESSION
WHERE AUDSID = Sys_Context('USERENV', 'SESSIONID');
Поскольку вы заинтересованы в текущем сеансе, текущий сеанс должен быть на локальном экземпляре (по определению), поэтому используйте V$SESSION
вместо GV$SESSION
, Кроме того, все, что вам нужно, это AUDSID
уникально идентифицировать вашу сессию.
Если у вас есть какая-то причина, вам действительно нужно использовать GV$SESSION
(не могу представить, почему это так), вместо этого вы можете сделать это:
SELECT SID, SERIAL#
FROM GV$SESSION
WHERE AUDSID = Sys_Context('USERENV', 'SESSIONID')
AND INST_ID = USERENV('Instance');
Кроме того, альтернативный способ получить SID
текущего сеанса:
select sid from v$mystat where rownum=1;
Надеюсь, это поможет.
Присоединение gv$session
а также v$mystat
:)
SELECT SID, SERIAL#,inst_id
FROM GV$SESSION
WHERE sid=(select sid from v$mystat where rownum=1);
Использование V$SESSION
вместо GV$SESSION
SELECT SID, SERIAL#
FROM V$SESSION
WHERE SID = Sys_Context('USERENV', 'SID');
Попробуйте это (потребуется доступ к представлениям v$session и v$sql) -
select /*My Sess*/ 'My Sess Text = hello world @ '||systimestamp SID_SR_TXT from dual
union
select 'SID = '||sid||' Serial# = '||serial# SID_SR_TXT from v$session where sql_id in
(select sql_id from v$sql where sql_text like '% My Sess %');