有没有办法在调用OCIStmtExecute()
后获取sql_id /子号/计划哈希?我无法在OCIAttrGet()
中看到它。
注意:作为无法看到v$session
的普通用户 - 如果可以的话,就像执行select prev_sql_id, prev_child_number from v$session where sid=sys_context('USERENV', 'SID')
一样简单
谢谢!
答案 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的函数
当然这很容易出错,因为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。