如何在OCI中获取sql_id

时间:2011-11-07 13:00:43

标签: c oracle oci

有没有办法在调用OCIStmtExecute()后获取sql_id /子号/计划哈希?我无法在OCIAttrGet()中看到它。

注意:作为无法看到v$session的普通用户 - 如果可以的话,就像执行select prev_sql_id, prev_child_number from v$session where sid=sys_context('USERENV', 'SID')一样简单

谢谢!

2 个答案:

答案 0 :(得分:0)

无法使用oci或sys_context获取sql_id或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位是计划哈希)

当然这很容易出错,因为oracle可能会改变将来计算sql_id的机制。

答案 1 :(得分: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。