c - OCI中如何获取sql_id

标签 c oracle oracle-call-interface

有没有办法在调用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/

相关文章:

php - 无法加载 oci8 -> fatal error : Call to undefined function oci_connect()

c - 使用简单的数学运算得出奇怪的结果

c - 如何读取c中的原始内存

c - 理解按位计算

sql - oracle sql查询中返回的限制字符数

c++ - 将 oracle oci.dll 与 mingw w64 64 位编译器一起使用

c - 是否需要使用 `O_NONBLOCK` 中的 `open()` 打开与 POSIX AIO 一起使用的文件描述符?

sql - 优化 Oracle Between Date 语句

oracle - Firebird 像 Oracle 中一样创建函数 TRANSLATE

Oracle OCI - 如何在不获取的情况下获取选择集中的行数