有没有办法在调用后获取 sql_id/子编号/计划哈希OCIStmtExecute()
?OCIAttrGet()
我在里面看不到
注意:作为一个看不到的普通用户v$session
- 如果可以的话,它就像执行一样简单select prev_sql_id, prev_child_number from v$session where sid=sys_context('USERENV', 'SID')
谢谢!
有没有办法在调用后获取 sql_id/子编号/计划哈希OCIStmtExecute()
?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 支持提交增强请求以添加该功能可能是一个好主意。
可以使用以下语句跟踪会话的所有 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 的机制。
以下查询应该有效,但前提是它是您希望识别的语句之后的下一个语句执行。
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。