7

有没有办法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当前会话可能无法访问(例如,当统计信息被禁用时)。

4

4 回答 4

12

尝试这个:

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;

希望有帮助。

于 2015-03-02T17:16:46.883 回答
1

加入gv$sessionv$mystat:)

 SELECT SID, SERIAL#,inst_id
  FROM GV$SESSION
 WHERE sid=(select sid from v$mystat where rownum=1); 
于 2016-05-30T11:01:43.297 回答
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 %');
于 2019-07-26T16:16:37.230 回答
0

使用V$SESSION代替GV$SESSION

SELECT SID, SERIAL#
FROM V$SESSION
WHERE SID = Sys_Context('USERENV', 'SID');
于 2018-06-29T15:16:34.087 回答