Есть ли способ получить информацию о текущем сеансе из 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 %');
Другие вопросы по тегам