有没有办法在调用OCIStmtExecute()
后获取sql_id/child number/plan hash?我在 OCIAttrGet()
中看不到它。
注意:作为看不到 v$session
的普通用户 - 如果可以的话,它就像执行 select prev_sql_id, prev_child_number from v$session where sid=sys_context(' USERENV', 'SID')
谢谢!
最佳答案
无法使用 oci 或 sys_context 获取 sql_id 或 plan_hash_value。但是,向 Oracle 支持提交增强请求以添加该功能可能是个好主意。
可以使用以下语句跟踪 session 的所有 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文本,计算一个128bit的md5
- 低 64 位是 sql_id(如果您感兴趣,低 32 位是计划哈希)
当然这很容易出错,因为 oracle 将来可能会更改计算 sql_id 的机制。
关于c - OCI中如何获取sql_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8036841/