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

Is there any way to get information about current session from gv$session in oracle?

在 Oracle 的 GV$SESSION 视图中是否有任何方法可以唯一标识当前会话?

我遇到的问题是,在 Oracle RAC 配置的情况下,以下查询可能 return 多行:

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

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

试试这个:

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$sessionv$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 %');