Как получить sql_id в OCI - PullRequest
       23

Как получить sql_id в OCI

2 голосов
/ 07 ноября 2011

Есть ли способ получить хэш sql_id / child number / plan после вызова OCIStmtExecute()? Я не вижу этого в OCIAttrGet().

ПРИМЕЧАНИЕ: Обычный пользователь, который не видит v$session - если можно, это так же просто, как выполнить select prev_sql_id, prev_child_number from v$session where sid=sys_context('USERENV', 'SID')

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 июня 2015

Предполагается, что следующий запрос будет работать, но только в том случае, если это будет следующее выполнение оператора после того, которое вы хотите идентифицировать.

select prev_sql_id, prev_child_number
  from v$session
 where sid = sys_context('userenv','sid')

И он работает ... большую часть времени.Мой клиент написал приложение PL / SQL для Oracle 12c и поместил вышеуказанный запрос в часть кода, которая выполняет запрос приложения.Он показал мне вывод, который показывает, что иногда он возвращает неправильное значение для prev_child_number.Я наблюдал, и это действительно не всегда возвращает правильные данные.За более чем 99 различных выполнений операторов он возвращал неправильное значение prev_child_number 6 раз.

Я нахожусь в процессе поиска существующих ошибок, которые приводят к тому, что этот запрос возвращает неправильные данные, и еще не нашел.Возможно, мне придется зарегистрировать новый SR с поддержкой Oracle.

0 голосов
/ 19 ноября 2011

Нет способа получить sql_id или plan_hash_value с помощью oci или sys_context. Однако было бы неплохо подать запрос на улучшение с поддержкой оракула, чтобы добавить эту функцию.

Существует возможность отследить все 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 и вычислите 128-битную md5
  • Младшие 64 бита - это sql_id (и, если вам интересно, младшие 32 бита - это хэш плана)

Конечно, это подвержено ошибкам, поскольку oracle может изменить механизм вычисления sql_id в будущем.

...