2011-11-07 18 views
2

有沒有一種方法調用OCIStmtExecute()後得到SQL_ID /兒童數/計劃哈希?我在OCIAttrGet()看不到它。如何獲得SQL_ID在OCI

注:由於誰也看不出v$session一個普通用戶 - 如果我可以這麼簡單,作爲執行select prev_sql_id, prev_child_number from v$session where sid=sys_context('USERENV', 'SID')

謝謝!

+0

爲什麼你需要sql_id?你究竟在努力實現什麼? – steve

+0

我想添加我的應用程序的調試日誌,執行sql_id xxx與plan_hash yyy,以便將我的應用程序日誌綁定到ASH – Gaius

回答

0

沒有辦法拿到SQL_ID或OCI或SYS_CONTEXT的plan_hash_value。不過,用oracle支持來提交增強請求以添加該功能可能是一個好主意。

有跟蹤會話的所有SQL語句與下面的語句的可能性:

alter session set events '10046 trace name context forever, level 12' 

根據或多或少的痕跡產生的跟蹤級別(級別4和8產生較少的信息)。要關閉跟蹤執行

alter session set events '10046 trace name context off' 

另一種選擇是創建一個函數來計算SQL_ID自己

  • 使用SQL文本和計算128位MD5
  • 低64位是sql_id(如果你有興趣,低32位是計劃散列)

當然,這是錯誤的傾向,因爲甲骨文可能會改變機制來計算sql_id in未來。

0

下面的查詢應該工作,但只有當它是下列您要找出一個第二天語句的執行。

select prev_sql_id, prev_child_number 
    from v$session 
where sid = sys_context('userenv','sid') 

它的確行得通......大部分時間。我的客戶爲Oracle 12c編寫了一個PL/SQL應用程序,並將上述查詢放在執行應用程序查詢的代碼部分。他向我展示了輸出,表明它有時會爲prev_child_number返回錯誤的值。我看了,它確實沒有總是返回正確的數據。超過99個不同的語句執行,它返回錯誤的prev_child_number 6次。

我在尋找導致此查詢返回錯誤的數據,並沒有發現任何尚未存在的缺陷的過程。我可能不得不用Oracle支持登錄一個新的SR。