有没有办法在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
(例如,禁用统计信息时)。
答案 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$session
和v$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 %');