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

有没有办法从oracle中的gv$session获取有关当前会话的信息?,oracle,session,oracle-rac,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(例如,当统计

在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
(例如,当统计信息被禁用时)。

尝试以下操作:

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
:)


使用
V$SESSION
而不是
GV$SESSION

SELECT SID, SERIAL#
FROM V$SESSION
WHERE SID = Sys_Context('USERENV', 'SID');
尝试此操作(需要访问v$session和v$sql视图)-


不幸的是,这两个选项都不能用于我的情况(我在问题中明确提到了这一点)
AUDSID
plus
SID
在Oracle RAC中不是唯一的(只有
SID
SERIAL#
的组合是唯一的),并且
V$MYSTAT
不可用,因为统计信息已关闭。对不起,我错过了关于V$MYSTAT的评论。顺便说一句,我认为这不是真的。我还没有测试,但我怀疑V$MYSTAT始终存在。但是我看不到任何关于不能使用V$SESSION而不是GV$SESSION的东西。但是,如果您确实因为某些疯狂的原因而无法使用V$SESSION,那么请使用上面的查询,但将其更改回GV$,然后添加一个额外的谓词“and inst_id=userenv('Instance')”。这与Oracle在V$视图定义中使用的谓词相同。正如我前面所说,在Oracle RAC配置中,当仅通过
AUDSID
过滤,甚至通过
AUDSID
SID
组合过滤时,V$会话和GV$会话可能会产生多行
AUDSID
可能不是唯一的。只有
SID
加上
SERIAL
的组合才是唯一的,但是如何获得当前会话的
SERIAL
?但是
inst\u id=userenv('Instance')
可以做到这一点。你能把它作为一个单独的答案加上吗?我将对其进行测试,如果有效,则将其标记为正确。我编辑了上面的答案,因为当我添加新答案时,系统强烈鼓励我编辑和改进现有答案,而不是添加新答案。如果有其他会话试图以同样的方式找到自己,则这将不起作用。除了“我的SES”之外,还必须有一些唯一标识符。
V$SESSION
在不生成唯一的
SID
SERIAL#
的情况下,如果是RACinstallation@VolodymyrFrolov反过来说。GV$SESSION提供每个节点的所有会话,并且SID在该视图中不能是唯一的。V$SESSION只提供当前节点的会话,在该上下文中SID是唯一的,因此如果您从该视图(
Sys\u context('USERENV','SID')
)查询会话id,您将获得您的会话,而不会意外地获得碰巧具有相同SID的其他人的会话,我不知道为什么在马克·J·博巴克(MarkJ.Bobak)三年前添加了他的答案后,我才添加了这个答案,因为他的答案包含相同的信息和更多信息。。
SELECT SID, SERIAL#
FROM V$SESSION
WHERE SID = Sys_Context('USERENV', 'SID');
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 %');