有没有办法从oracle中的gv $ session获取有关当前会话的信息?

时间:2015-03-02 16:20:47

标签: oracle session oracle-rac

有没有办法在Oracle的GV$SESSION视图中唯一标识当前会话?

我遇到过以下问题:在Oracle RAC配置的情况下,以下查询可能会返回多行:

SELECT SID, SERIAL#
FROM GV$SESSION
WHERE AUDSID = Sys_Context('USERENV', 'SESSIONID')
   AND SID = Sys_Context('USERENV', 'SID');

使用V$MYSTAT也不是一种选择,因为当前会话可能无法访问V$MYSTAT(例如,禁用统计信息时)。

4 个答案:

答案 0 :(得分:4)

试试这个:

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;

希望有所帮助。

答案 1 :(得分:1)

加入gv$sessionv$mystat:)

 SELECT SID, SERIAL#,inst_id
  FROM GV$SESSION
 WHERE sid=(select sid from v$mystat where rownum=1); 

答案 2 :(得分:0)

使用V$SESSION代替GV$SESSION

SELECT SID, SERIAL#
FROM V$SESSION
WHERE SID = Sys_Context('USERENV', 'SID');

答案 3 :(得分:0)

尝试此操作(将需要访问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 %');