Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > как передать переменную в запрос XMLQuery из кода


Автор: day2030 24.10.2012, 10:09
Всем доброго времени суток.
Подскажите пожалуйста решение следующей проблемы если такое возможно.
В коде pl/sql организован цикл. В теле цикла идет выборка из xml файла, каждый xml файл хранится в таблице. Значение xmlquery нужно получать по номеру узла, а номер узла это переменная j  определенная в цикле:
Код

for j in 1..x loop
       select XMLQuery('//DocBatch[position()=j]' passing xmltype(b.filexml_r) returning content).getStringVal() into mytest from table_car b where b.keyxml_r = keyxml_r;
 end loop;

Данный код не работает т.к. перменная j определена в цикле а не в запросе XMLQuery. Т.е. если j заменить на конкретное значение то все работает:
for j in 1..x loop
       select XMLQuery('//DocBatch[position()=1]' passing xmltype(b.filexml_r) returning content).getStringVal() into mytest from table_car b where b.keyxml_r = keyxml_r;
 end loop;
[/code]
Как передать в XMLQuery переменную определенную в коде и вообще возможно ли это????
Заранее спасибо.

Автор: Zloxa 24.10.2012, 10:31
в лоб, конкатенацией?
Код

select XMLQuery('//DocBatch[position()='||j||']'...


Добавлено @ 10:33
но так вобще такой разбор выглядит странным. Что мешает распарсить xml одним XMLTable и просто обойти курсор?

Автор: day2030 24.10.2012, 10:51
Попробовала, но не работает:
Код

for j in 1..x loop
       select XMLQuery('//DocBatch[position()='||j||']' passing xmltype(b.filexml_r) returning content).getStringVal() into mytest from car_table where b.keyxml_r = keyxml_r;
 end loop;


Выходит ошибка:
pl/aql: ora-19109 returning keyword expected

Автор: Zloxa 24.10.2012, 10:51
Цитата(Zloxa @  24.10.2012,  11:31 Найти цитируемый пост)
одним XMLTable и просто обойти курсор

Код

SQL> set serveroutput on
SQL> 
SQL> declare
  2    xml clob := '<foo><DocBatch>Hello</DocBatch><DocBatch>World</DocBatch></foo>';
  3  begin
  4    for i in (select *
  5                from xmlTable ('/foo/DocBatch'
  6                passing xmlType(xml)
  7                columns DocBatch varchar2(50) path 'text()'
  8                ))
  9    loop
 10      dbms_output.put_line(i.DocBatch);
 11    end loop;
 12  end;
 13  /
 
Hello
World
 
PL/SQL procedure successfully completed


Добавлено @ 11:00
Цитата(day2030 @  24.10.2012,  11:51 Найти цитируемый пост)
Выходит ошибка:
pl/aql: ora-19109 returning keyword expected 

Передать выражение через бинд
Код

SQL> set serveroutput on
SQL> set define off
SQL> 
SQL> declare
  2    xml clob := '<foo><DocBatch>&lt;Hello</DocBatch><DocBatch>World</DocBatch></foo>';
  3    mytest varchar2(50);
  4    xquerytext varchar2(4000);
  5  begin
  6    for j in 1..2
  7    loop
  8       xquerytext := '//DocBatch[position()='||j||']/text()';
  9       select XMLQuery(xquerytext
 10                           passing xmltype(xml)
 11                           returning content
 12                        ).getStringVal()
 13         into mytest
 14         from dual;
 15       dbms_output.put_line(mytest);
 16    end loop;
 17  end;
 18  /
 
&lt;Hello
World
 


Обратите внимание, что getStringVal возвращает вам текстовое представление XML фрагмента возвращенного XMLQuery. По этой причине символ меньше не преобразовалсяю
Для того, чтобы извлечь значение, используйте extractValue
Код

SQL> declare
  2    xml clob := '<foo><DocBatch>&lt;Hello</DocBatch><DocBatch>World</DocBatch></foo>';
  3    mytest varchar2(50);
  4    xquerytext varchar2(4000);
  5  begin
  6    for j in 1..2
  7    loop
  8       xquerytext := '//DocBatch[position()='||j||']';
  9       select ExtractValue(XMLQuery(xquerytext
 10                           passing xmltype(xml)
 11                           returning content
 12                           )
 13                          ,'*')
 14         into mytest
 15         from dual;
 16       dbms_output.put_line(mytest);
 17    end loop;
 18  end;
 19  /
 
<Hello
World
 
PL/SQL procedure successfully completed

Автор: day2030 24.10.2012, 11:06
Спасибо большое, сейчас поробую оптимизировать подсказку под свои нужды. Просто сам xml очень сожный и там много вложений, у DocBatch есть вложения значения которых мне как раз и нужны а самих  элементов DocBatch очень много, поэтому я и хотела последовательно работать с каждым.

Автор: Zloxa 24.10.2012, 11:16
Цитата(day2030 @  24.10.2012,  12:06 Найти цитируемый пост)
Просто сам xml очень сожный

XQuery - весьма развитый язык и, когда его имплементация не глючит, позволяет обработать конструкции практически любой сложности. Увы, в оракле имплементация весьма глючна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)