獲取當前會話資訊的方法

yangtingkun發表於2011-01-22

一直以為有兩種方法可以獲取當前會話資訊,最近才發現其中一種已經不再適用。

 

 

從剛接觸Oracle的時候,就聽說兩種獲取當前會話的方法,一種是透過關聯V$MYSTAT獲取當前會話的SID;另一種是判斷會話的AUDSID是否等於USERENV中的SESSIONID

第二種方法雖然可以少關聯一個檢視,但是相對畢竟複雜,而且寫法不很直觀不容易記,因此絕大多數情況下,會選擇第一種方法。不過在TomExpert one on one Oracle中,他是利用的第二種方法。

而最近進行一個測試的時候,心血來潮嘗試了一下第二種方法,卻意外的發現這種方法已經不再適用了:

SQL> select spid
  2  from v$process p, v$session s
  3  where p.addr = s.paddr
  4  and s.audsid = sys_context('USERENV', 'SESSIONID');

SPID
------------
28178
28114
28505
29750
29752
29753

6 rows selected.

SQL> select sid
  2  from v$session
  3  where audsid = sys_context('USERENV', 'SESSIONID');

       SID
----------
      1078
      1079
      1081
      1085
      1089
      1093

6 rows selected.

SQL> select sid
  2  from v$session
  3  where audsid = USERENV('SESSIONID');

       SID
----------
      1078
      1079
      1081
      1085
      1089
      1093

6 rows selected.

而第一種方法則沒有任何的問題:

SQL> select sid, spid
  2  from v$process p, v$session s
  3  where p.addr = s.paddr
  4  and s.sid in
  5  (select sid
  6  from v$mystat
  7  where rownum = 1);

       SID SPID
---------- ------------
      1089 28505

查詢了metalink後發現,第二種方法似乎在9i以後就不保證返回當前的會話了,看來可以徹底忘記這種方法了。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-684479/,如需轉載,請註明出處,否則將追究法律責任。

相關文章