Как получить последний выполненный оператор SQL и связать значения переменных в Oracle - PullRequest
11 голосов
/ 10 ноября 2009

Я написал следующий запрос, чтобы получить последний выполненный оператор SQL в базе данных Oracle для определенного сеанса. Текст SQL не содержит фактического значения переменных связывания. Как получить значения переменных связывания вместе с текстом SQL.

SELECT * FROM v$SQLTEXT_WITH_NEWLINES WHERE address = 
  (SELECT prev_sql_addr FROM v$session WHERE audsid = userenv('SESSIONID'))
ORDER BY piece;

Ответы [ 4 ]

25 голосов
/ 21 июля 2010

Чтобы получить переменные связывания, вам нужно использовать приведенный ниже код, вам не нужно использовать трассировку.

SELECT * FROM v$sql_bind_capture WHERE sql_id='';

или

SELECT NAME,POSITION,DATATYPE_STRING,VALUE_STRING 
FROM v$sql_bind_capture WHERE sql_id='';

http://shaharear.blogspot.com/2009/02/find-bind-variable-value.html

5 голосов
/ 10 ноября 2009

Я не думаю, что значения переменных связывания сохраняются по умолчанию. Не принимая во внимание потенциальные проблемы безопасности (учитывая фактическую работу других сеансов), объем данных для хранения будет огромным.

Если вы хотите увидеть значения переменных связывания, вы должны активировать трассировку для этого сеанса. Это можно сделать, выполнив в этом сеансе следующую команду:

alter session set events '10046 trace name context forever, level 12'; 

Дополнительная информация о AskTom: трассировка 10046

3 голосов
/ 13 марта 2011

если вы находитесь в sqlplus, вы можете выполнить

select * from table ( dbms_xplan.display_cursor (null,null, 'ADVANCED'));

или если вы ищете SQL, выполненный кем-то другим, просто вставьте свой SQL_ID и дочерний курсор #:

select * from table ( dbms_xplan.display_cursor ('sql_id',child_cursor#, 'ADVANCED'));

как в

select * from table ( dbms_xplan.display_cursor ('a18asdr99x',0, 'ADVANCED'));

Этот метод показывает только показанные переменные связывания. Единственный надежный способ - трассировка с помощью переменных связывания

dbms_monitor.session_trace_enable(session_id => 127, serial_num => 29, waits => FALSE, binds => TRUE)

но, конечно, это нужно сделать до того, как запрос будет выполнен

2 голосов
/ 03 ноября 2016

Запустите приведенный ниже запрос, который принимает sql_id в качестве входного параметра и выдаст выходные данные с замененными значениями переменных связывания.

set serveroutput on;


DECLARE
   v_fulltext   CLOB;
   v_sql_id     VARCHAR2 (100);

   CURSOR c1( v_sql_id varchar2)
   IS
      SELECT decode(substr(NAME,1,4),':SYS',replace(name,':',':"')||'"' ,NAME ) NAME, POSITION, datatype_string,nvl(VALUE_STRING,'NULL') value_string
    FROM v$sql_bind_capture
       WHERE sql_id = v_sql_id;
BEGIN

  v_sql_id:= '&sql_id';

   SELECT sql_fulltext
     INTO v_fulltext
     FROM v$sql
    WHERE sql_id =v_sql_id  AND ROWNUM = 1;

   FOR rec IN c1(v_sql_id)
   LOOP


      IF substr(rec.datatype_string,1,8) = 'VARCHAR2'
      THEN
     SELECT REPLACE (v_fulltext,
             rec.NAME,
             '''' || rec.value_string || ''''
            )
       INTO v_fulltext
       FROM DUAL;
      END IF;

      IF rec.datatype_string = 'NUMBER'
      THEN
     SELECT REPLACE (v_fulltext, rec.NAME, rec.value_string)
       INTO v_fulltext
       FROM DUAL;
      END IF;

   END LOOP;
   DBMS_OUTPUT.PUT_LINE(v_fulltext);

   EXCEPTION
   WHEN NO_DATA_FOUND
   THEN DBMS_OUTPUT.PUT_LINE('NO SQL FOUND FOR THE SQL ID');

END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...