Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как передать переменную в запрос XMLQuery из кода 
:(
    Опции темы
day2030
Дата 24.10.2012, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



Всем доброго времени суток.
Подскажите пожалуйста решение следующей проблемы если такое возможно.
В коде 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 переменную определенную в коде и вообще возможно ли это????
Заранее спасибо.
PM MAIL   Вверх
Zloxa
Дата 24.10.2012, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



в лоб, конкатенацией?
Код

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


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

Это сообщение отредактировал(а) Zloxa - 24.10.2012, 10:37


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
day2030
Дата 24.10.2012, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



Попробовала, но не работает:
Код

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
PM MAIL   Вверх
Zloxa
Дата 24.10.2012, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(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


Это сообщение отредактировал(а) Zloxa - 24.10.2012, 11:03


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
day2030
Дата 24.10.2012, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



Спасибо большое, сейчас поробую оптимизировать подсказку под свои нужды. Просто сам xml очень сожный и там много вложений, у DocBatch есть вложения значения которых мне как раз и нужны а самих  элементов DocBatch очень много, поэтому я и хотела последовательно работать с каждым.
PM MAIL   Вверх
Zloxa
Дата 24.10.2012, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



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

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.