2

有没有办法在调用后获取 sql_id/子编号/计划哈希OCIStmtExecute()OCIAttrGet()我在里面看不到

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

谢谢!

4

2 回答 2

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 文本并计算一个 128bit md5
  • 低 64 位是 sql_id(如果您感兴趣,低 32 位是计划哈希)

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

于 2011-11-19T05:13:14.230 回答
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。

于 2015-06-10T18:41:53.940 回答