Как получить проанализированный динамический пл Sql - PullRequest
0 голосов
/ 07 марта 2012

У меня есть много функций и процедур PL / SQL, которые выполняют динамический sql.

Можно ли извлечь проанализированные операторы и dbms_output в качестве средства отладки?

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

Пример:

У меня есть динамический оператор SQL, подобный этому

 SQ:='SELECT  :pComno as COMNO,null t$CPLS,t$CUNO,t$cpgs,t$stdt,t$tdat,t$qanp,t$disc,:cS Source FROM BAAN.TTDSLS031'||PCOMNO --1
    || ' WHERE' ||' TRIM(T$CUNO)=trim(:CUNO)' --2  
    ||    ' AND  TRIM(T$CPGS)=trim(:CPGS)' --3
    ||    ' AND  T$QANP      = priceWorx.fnDefaultQanp ' --4
    ||    ' AND  priceWorx.fdG2J(sysdate) between priceWorx.fdG2J(t$stdt) and priceWorx.fdG2J(t$tdat)' --5
    ||    ' AND  rownum=1 order by t$stdt';--6

    execute immediate SQ into R using 
        PCOMNO,'C' --1
        ,PCUNO-- 2
        ,PCPGS;-- 3

Каким будет оператор, отправляемый на сервер?

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Вы можете отобразить переменные связывания, связанные с оператором SQL, следующим образом:

select v$sql.sql_text
    ,v$sql_bind_capture.*
from v$sql_bind_capture
inner join v$sql on
    v$sql_bind_capture.hash_value = v$sql.hash_value
    and v$sql_bind_capture.child_address = v$sql.child_address
--Some unique string from your query
where lower(sql_text) like lower('%priceWorx.fdG2J(sysdate)%');

Вы, вероятно, хотели бы видеть весь запрос со всеми переменными связывания, замененными их фактическими значениями.К сожалению, нет простого способа получить именно то, что вы ищете, из-за следующих проблем:

  1. V $ SQL_BIND_CAPTURE не хранит всю информацию о переменных привязки,Самое большое ограничение состоит в том, что он отображает данные «только когда переменная связывания используется в предложениях WHERE или HAVING инструкции SQL».
  2. Сопоставить имена переменных связывания из данных захвата связывания с запросом невероятно сложно,Работать легко в 99% случаев, но для последних 1% требуется синтаксический анализатор SQL и PL / SQL, что в принципе невозможно.
  3. SQL устареет из пула.Например, если вы соберете статистику для одной из соответствующих таблиц, это может сделать недействительными все запросы, использующие эту таблицу.Вы не можете всегда доверять V $ SQL, чтобы получить ваш запрос.

Что означает, что вы, вероятно, застряли, делая это безобразно.Вам нужно вручную сохранить данные SQL и переменные связывания, аналогично тому, что делает user1138658.

1 голос
/ 08 марта 2012

Вы можете сделать это с пакетом dbms_output. Вы можете enable и disable отладить и получить строки с помощью процедуры get_line.

Я тестировал с execute immediate, вставляя в таблицу и все работает.

Я недавно ответил на другой вопрос с примером использования этого.

0 голосов
/ 07 марта 2012

Одним из возможных решений этого является создание таблицы temp(id varchar2,data clob); в вашей схеме, а затем поместить оператор вставки туда, где вы хотите найти проанализированный ключ

insert into temp values(seq.nextval,v_text);

Например

declare 
v_text varchar2(2000);
begin
v_text:='select * from emp'; -- your dynamic statement

insert into temp values(seq.nextval,v_text); --insert this script whenever you want to find the actual query 

OPEN C_CUR FOR v_text;

-----

end;

Теперь, если вы увидите таблицу temp, вы получите данные для этого динамического оператора.

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