powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
239 сообщений из 239, показаны все 10 страниц
XML в Oracle9i. Примеры разборки
    #33355543
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Помогите разобраться в разборке XML в Oracle 9i.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>

Есть массив:
v_array_surnames

Как можно вытащить все значения аттбирута с name="SURNAME" сразу в массив? XML у меня типа Xmltype;

Заранее благодарен!
Flukky
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33355597
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY'))) d;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33355746
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, работает очень красиво. Подскажите, пожалуйста, где найти инфрмацию про XMLSequence и Extract (а также другими функциями по обработке XMLType).

Oracle9i XML API Reference - XDK and Oracle XML DB
Release 2 (9.2)
Part VI
XML Database Support: Oracle XML DB for PL/SQL

Тут я что-то не могу найти :/
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33355820
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поищи рядом, в XML Database Developer's Guide - Oracle XML DB , или просто поиском:
http://www.oracle.com/pls/db92/db92.drilldown?remark=&word=XMLSequence+and+extract
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33355909
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне очень интересно, почему не работает такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://testserver response.xsd">
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY'))) d;

Запрос остаёться тем же, но в теге <RESPONSE> появились дополнительная информация
Код: plaintext
<RESPONSE xmlns="http://testserver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://testserver response.xsd">
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33355916
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovПоищи рядом, в XML Database Developer's Guide - Oracle XML DB , или просто поиском:
http://www.oracle.com/pls/db92/db92.drilldown?remark=&word=XMLSequence+and+extract

Спасибо, попробуем!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33356054
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В документации по 9-ке сразу не нашел, а в документации по Oracle10g есть:
http://www.oracle.com/pls/db102/drilldown?remark=quick_search&word=XMLSequence+and+xmlns

Впрочем, работает и в 9i:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract(
          'RESPONSE/DATA/ENTITY'
        , 'xmlns="http://testserver"'
      ))) d;

Обрати внимание на выделенную строку.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33358607
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно, например, какой-то функцией удалить всю дополнительную информацию из тега RESPONSE?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33358611
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А конкретно, эту ерудну:
Код: plaintext
1.
2.
3.
xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd"
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33358759
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В качестве одной мысли: если исходный XML окаймить еще одним элементом, т.е. вложить в некий другой XML, то extract(), с учетом исправленного пути, работает и без namespace. Осталось только понять, можно ли это сделать максимально легко. В Oracle10 есть метод XMLType.insertXMLBefore(), но в Oracle 9.2 его еще нет. Хотя, думаю, должны быть и другие варианты, может есть способ получить все namespace'ы из документа?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33358781
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popovможет есть способ получить все namespace'ы из документа?
например, через xmlparser и xmldom:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96621/adx20ppl.htm#1006936
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33359197
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov Denis Popovможет есть способ получить все namespace'ы из документа?
например, через xmlparser и xmldom:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96621/adx20ppl.htm#1006936

Что-то похожее я делал в 8 оракле. Это сначала нужно сложить всё в массив, потом в цикле IFами уже вытаскивать по нужным переменным. Это дело может быть долгим.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33359237
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33359733
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Родился ещё один вопрос. Допустим, у нас есть тот же XML, но уже с двумя "пакетами" внутри:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="PASSP_NO" value="AAA012345678" />
      <ATTRIBUTE name="ISSUE_DATE" value="01.01.2000" />
    </ENTITY>
  </DATA>
</RESPONSE>

Тоесть есть 2 персоны и только у одной есть пасспорт. Пакеты 001 и 002 связаны по PERS_ID.
Делаю запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
   x1.extract('//ENTITY//ATTRIBUTE[@name="FIRST_NAME"]/@value').getStringVal() as person_name
  ,x1.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() as person_surname
  ,x2.extract('//ENTITY//ATTRIBUTE[@name="PASSP_NO"]/@value').getStringVal() as passport_no
  ,x2.extract('//ENTITY//ATTRIBUTE[@name="ISSUE_DATE"]/@value').getStringVal() as passport_issue_date
from
   table(XMLSequence(v_response_without_passp.extract('RESPONSE/DATA/ENTITY[@name="PACKAGE_001"]'))) x1
  ,table(XMLSequence(v_response_without_passp.extract('RESPONSE/DATA/ENTITY[@name="PACKAGE_002"]'))) x2
where
   extractValue(value(x1),'//ENTITY//ATTRIBUTE[@name="PERS_ID"]/@value') = extractValue(value(x2),'//ENTITY//ATTRIBUTE[@name="PERS_ID"]/@value')

В результате получаем только ту персону, у которой есть пасспорт:
Код: plaintext
1.
2.
3.
4.
person_name = OLGA
person_surname = NOVIKOVA
passport_no = AAA012345678
passport_issue_date =  01 . 01 . 2000 
Как же получить персону, у которой нет пасспорта в таком формате:
Код: plaintext
1.
2.
3.
4.
person_name = ANNA
person_surname = ANTONOVA
passport_no = 
passport_issue_date = 
?

Оператор (+) не работает :(
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33360069
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky wrote:
> Что-то похожее я делал в 8 оракле. Это сначала нужно сложить всё в
> массив, потом в цикле IFами уже вытаскивать по нужным переменным. Это
> дело может быть долгим.

Я думал про следующее: через xmldom.getNamespace() получить только этот самый namespace и потом уже
его использовать в extract(). Хотя это получается двойной разбор одного и того же XML. Для
уменьшения накладных расходов Тут можно попробовать еще один вариант: через аналогичный пример,
используя xslprocessor, получить новый XML (раз исходный уже разобран), содержащий минимум требуемых
данных, и потом его уже скормить XMLType.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33360134
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyРодился ещё один вопрос.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
create table tmp_xml (xml XMLType);

insert into tmp_xml (xml) values (XMLType(
'<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="PASSP_NO" value="AAA012345678" />
      <ATTRIBUTE name="ISSUE_DATE" value="01.01.2000" />
    </ENTITY>
  </DATA>
</RESPONSE>'
));

select p.id
     , max(p.person_surname) person_surname
     , max(p.passport_no) passport_no
     , max(p.passport_issue_date) passport_issue_date
from (select d.extract('//ENTITY//ATTRIBUTE[@name="PERS_ID"]/@value').getStringVal() id
           , d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() person_surname
           , d.extract('//ENTITY//ATTRIBUTE[@name="PASSP_NO"]/@value').getStringVal() passport_no
           , d.extract('//ENTITY//ATTRIBUTE[@name="ISSUE_DATE"]/@value').getStringVal() passport_issue_date
      from tmp_xml t
         , table(XMLSequence(t.xml.extract('RESPONSE/DATA/ENTITY'))) d
     ) p
group by p.id;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33360588
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, спасибо огромнейшее!

Пока буду пробывать предложенные варианты, задам ещё один вопрос.
Вопрос 1. Часть 1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA />
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA- 01403 : no data found</ERROR>
      <ERROR>ORA- 20000 : person_id is empty</ERROR>
    </SYSTEM_ERRORS>
</RESPONSE>
Задача сложить значения элементов <ERROR> в массив.

Код: plaintext
1.
2.
select x.extract('/SYSTEM_MESSAGES/ERROR').getStringVal() as errmsg
from   table(xmlsequence(MY_XML)) x;
Такой запрос возвращает значения элементов <ERROR> и сами элементы "<ERROR>" и "</ERROR>". А нужны только значения, т.е. сообщения об ошибках.
Запрос с extractValue() ругается на то, что возвращено более одной строки и я его понимаю :)

Вопрос 1. Часть 2.
Можно ли значения <ERROR> сложить сразу же в виде:
"сообщение1; сообщение2; сообщение3" с помощью XML-парсера?

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33360719
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Используй text() для вывода значения элемента
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select d.extract('//SYSTEM_ERRORS/ERROR/text()').getStringVal() error
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/SYSTEM_ERRORS'))) d;

Второе можно делать разными путями, например:
XMLSequence возвращает тип table of XMLType, к нему е можно привести:
Код: plaintext
1.
2.
3.
4.
create or replace type XML_TABLE as table of XMLType
/
select ...
from table(cast(XMLSequence(...) as XML_TABLE))
Это я к тому, что на основе статьи из FAQ можно написать функцию по соединению полученных записей.


Через XSL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
create table test_xml (xml XMLType);
insert into test_xml (xml) values (XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'));

create table test_xsl (xsl XMLType);
insert into test_xsl (xsl) values (XMLType(
'<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no"/>

<xsl:template match="/">
<xsl:for-each select="RESPONSE/DATA/SYSTEM_ERRORS/ERROR">
  <xsl:choose>
    <xsl:when test="position()=1"></xsl:when>
    <xsl:otherwise>;</xsl:otherwise>
  </xsl:choose>
  <xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>'));
commit;

select XMLTransform (
          xml.xml
        , (select xsl from test_xsl)
       ).getStringVal() result
from test_xml xml;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33363591
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov1. Используй text() для вывода значения элемента
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select d.extract('//SYSTEM_ERRORS/ERROR/text()').getStringVal() error
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/SYSTEM_ERRORS'))) d;


Да, но в этом случае результат будет:
Код: plaintext
1.
Incorrect person ID, please check input dataORA- 01403 : no data foundORA- 20000 : person_id is empty

А мне бы хотелось его красиво оформить перед этим. Error1; Error2; ...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33363597
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
"//SYSTEM_ERRORS/ERROR[1]/text()"; "//SYSTEM_ERRORS/ERROR[2]/text()"; "//SYSTEM_ERRORS/ERROR[3]/text()".

Только как я могу узнать, сколько элементов <ERROR> у меня в документе?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33363794
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky wrote:
> А мне бы хотелось его красиво оформить перед этим. Error1; Error2; ...

Тогда действуй как я уже говорил: либо через XSL, либо получай несколько записей и обрабатывай их
собственной процедурой. Но text() все равно придется использовать для получения значения элемента.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364053
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov
либо получай несколько записей и обрабатывай их
собственной процедурой. Но text() все равно придется использовать для получения значения элемента.

Я сделал без text() и без собственной процедуры:
1. Вытащил записи в формате <ERROR>...</ERROR>
2. Спомощью функции Replace заменил эти теги

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select replace(replace(d.extract('//SYSTEM_ERRORS/ERROR').getStringVal(),'<ERROR>',null),'</ERROR>',';') error
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/SYSTEM_ERRORS'))) d;

Работать работает :)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364342
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov Denis Popovможет есть способ получить все namespace'ы из документа?
например, через xmlparser и xmldom:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96621/adx20ppl.htm#1006936

А как тогда преобразовать мой XMLType в dbms_xmldom.DOMDocument и обратно?

Функция будет выглядеть примерно так:
Код: plaintext
1.
2.
function sweeper(p_xml  in xmltype)
return xmltype;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364388
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky wrote:
> А как тогда преобразовать мой XMLType в dbms_xmldom.DOMDocument и обратно?

Не знаю, может и никак. Через dbms_xmldom я думал только получить namespace, а потом использовать в
XMLType.extract(), потому и говорил о двойном разборе.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364578
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov
Через dbms_xmldom я думал только получить namespace, а потом использовать в
XMLType.extract(), потому и говорил о двойном разборе.
Posted via ActualForum NNTP Server 1.3

Функции из пакета xdb.dbms_xmldom:
Код: plaintext
1.
2.
3.
4.
5.
6.
-- 1
PROCEDURE getNamespace(n DOMnode, data IN OUT VARCHAR2);
-- 2
FUNCTION getNamespace(a DOMAttr) return varchar2;
-- 3
FUNCTION getNamespace(elem DOMElement) return varchar2;

Какую из них использовать (DOMnode, DOMAttr, DOMElement), если на входе у меня параметр типа XMLType?
Либо я совсем не в ту степь смотрю?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364675
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
declare
  xml     XMLType := XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
  <DATA/>
</RESPONSE>');
  parser  xmlparser.Parser;
  xmldoc  xmldom.DOMDocument;
  xslelem xmldom.DOMElement;
  nspace  varchar2( 50 );
begin
  parser := xmlparser.newParser;
  xmlparser.setValidationMode(parser, false);
  xmlparser.setPreserveWhiteSpace(parser, true);
  xmlparser.parseClob(parser, xml.getClobVal());
  xmldoc := xmlparser.getDocument(parser);
  xslelem := xmldom.getDocumentElement(xmldoc);
  nspace := xmldom.getNamespace(xslelem);
  dbms_output.enable( 20000 );
  dbms_output.put_line('Namespace: '||nspace);
end;
/



...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364691
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovВ качестве одной мысли: если исходный XML окаймить еще одним элементом, т.е. вложить в некий другой XML, то extract(), с учетом исправленного пути, работает и без namespace.

Я сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
select
    xmlelement("MY_RESPONSE",
                    xmltype('<RESPONSE
xmlns="http://testserver"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://testserver response.xsd">
 <DATA REQUEST_ID="111">
  <ENTITY name="PACKAGE_001">
   <ATTRIBUTE name="PERS_ID" value="1111" />
   <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
   <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
  </ENTITY>
 </DATA>
</RESPONSE>'))
from dual;

-- output
'<MY_RESPONSE><RESPONSE
xmlns="http://testserver" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://testserver response.xsd">
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111"/>
      <ATTRIBUTE name="FIRST_NAME" value="OLGA"/>
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA"/>
    </ENTITY>
  </DATA>
</RESPONSE>
</MY_RESPONSE>'

В результате запроса my_XML.existsNode('RFP/RESPONSE') получаем '0'. Не получилось.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364701
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, я имел в виду xmldom, использованный в примере

А в заблуждение попал из-за версий Oracle: в Oracle 10.2 синоним XMLDOM указывает на пакет sys.DBMS_XMLDOM, а в Oracle 9.2 на sys.XMLDOM.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364723
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovИзвиняюсь, я имел в виду xmldom, использованный в примере

А в заблуждение попал из-за версий Oracle: в Oracle 10.2 синоним XMLDOM указывает на пакет sys.DBMS_XMLDOM, а в Oracle 9.2 на sys.XMLDOM.

В 9-ом Оракле это XDB.DBMS_XMLDOM.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364978
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дополнение к этому XSL , заметил, что если в XSL указать в имени шаблона не "/", а имя элемента с указанным namespace, то оно работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
create table test_xml (xml XMLType);
insert into test_xml (xml) values (XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'));

create table test_xsl (xsl XMLType);
insert into test_xsl (xsl) values (XMLType(
'<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no"/>

<xsl:template match="RESPONSE">
<xsl:for-each select="RESPONSE/DATA/SYSTEM_ERRORS/ERROR">
  <xsl:choose>
    <xsl:when test="position()=1"></xsl:when>
    <xsl:otherwise>;</xsl:otherwise>
  </xsl:choose>
  <xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>'));
commit;

select XMLTransform (
          xml.xml
        , (select xsl from test_xsl)
       ).getStringVal() result
from test_xml xml;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364995
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и напоследок: баловство все это:) Подсказали мне, как получается namespace в XMLType (через тот же XSL):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
  XMLType(
'<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
</RESPONSE>'
  ).transform(
    XMLType(
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/*">
    <xsl:value-of select="namespace-uri(.)"/>
  </xsl:template>
</xsl:stylesheet>'
    )
  ).getStringVal() namespace 
from dual;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368529
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovНу и напоследок: баловство все это:) Подсказали мне, как получается namespace в XMLType

Красивый вариант. Тоесть я снчала извлекаю этот namespace, а потом уже его использую в операторе extract(), как второй параметр. Вроди хорошая реализация (до тех пор, пока в FROM используется extract()).

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368530
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky
Код: plaintext
1.
"//SYSTEM_ERRORS/ERROR[1]/text()"; "//SYSTEM_ERRORS/ERROR[2]/text()"; "//SYSTEM_ERRORS/ERROR[3]/text()".

Только как я могу узнать, сколько элементов <ERROR> у меня в документе?

Этот вопрос ещё актуален. Как узнать количество элементов в документе?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368579
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyИ ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?

Этот вопрос тоже всё ещё актуален.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368593
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, с разборкой XML документов более или менее разобрался. Не исключено, что начав разрабатывать реально приложение (сейчас только тесты), ещё появяться.

Теперь есть вопрос про составление XML документа .

Какие функции обычно используют для составления XML документа? xmltype(varchar2) и xmltype.createxml(varchar2) я уже знаю (хотя не пойму, чем одна от другой отличаются).

Также знаком с функциями из пакета DBMS_XMLDOM и DBMS_XMLPARSER. Но эти функции создают XMLDOMDOCUMENT , а мне хотелось бы узнать, какие функции работают с типом XMLTYPE .

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368649
Фотография Andrew IF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если посмотреть Oracle9i Database Online Documentation раздел SQL, PL/SQL, and SQL*Plus syntax and examples. на букву X , то там есть всё, что надо.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368763
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyЭтот вопрос ещё актуален. Как узнать количество элементов в документе?
Думаю, через тот же XMLSequence.
FlukkyИ ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?
В Оракле есть функция CONVERT для перекодировки строк. На крайняк можно через Java перекодировать весь XML, даже подправив атрибут encoding.
FlukkyТакже знаком с функциями из пакета DBMS_XMLDOM и DBMS_XMLPARSER. Но эти функции создают XMLDOMDOCUMENT, а мне хотелось бы узнать, какие функции работают с типом XMLTYPE.
Могу врать, но вроде как это независимые вещи. XMLDOM реализован с использованием Java (я получал явские исключения при его использовании) XMLType и иже с ними (м.б. с какой-то версии Оракла) Java не используют и рекомендованы к использованию как главное направление.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369227
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно извиняюсь за своё недопонимание, но я не могу найти в доке того, что мне нужно. Там куча информации... Я попросту не знаю, что искать, наверное...

В DBMS_XMLDOM были такие процедуры:
dbms_xmldom.makeNode
dbms_xmldom.createElement
dbms_xmldom.appendChild
dbms_xmldom.createTextNode

А для XMLType я ничего такого не вижу. Ну тоесть, нужно создать структуру дерева, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
'<RECORD1>
 <RECORD1_1>Text</RECORD1_1>
 <RECORD1_2 name="NAME1_2" value="VALUE1_2" />
 <SUBRECORD>
   <SUB1>Text</SUB1>
   <SUB2>Text</SUB2>
 </SUBRECORD>
 <NOTES />
</RECORD1>'

Можно, конечно, создать это дело спомощью DBMS_XMLDOM, потом превратить в CLOB/Varchar2, а потом в XMLType. Но я недаюсь, что есть методы по-проще.

Спасибо! И извините за глупые вопросы...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369390
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select XMLElement(
           "RECORD1"
         , XMLElement("RECORD1_1", 'Text')
         , XMLElement("RECORD1_2", XMLAttributes('NAME1_2' as "name", 'VALUE1_2' as "value"))
         , XMLElement(
               "SUBRECORD"
             , XMLElement("SUB1", 'Text')
             , XMLElement("SUB2", 'Text')
           )
         , XMLElement("NOTES")
       ) xml
from dual;
Т.е. получается все наоборот, построение идет не от корня, а к корню XML. Есть еще функция updateXML , но ИМХО строить через чее XML с нуля достаточно напряжно.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369853
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Очень удобный подход к построению документа в 9-ке!

Сейчас пробую разобраться с updateXML().
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369868
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что будет быстрее работать, если мне нужно составить такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
'
<REQUEST>
  <TITLTE>TEST</TITLE>
  <PARAM name="param1" value="1" />
  <PARAM name="param2" value="2" />
  ...
  <PARAM name="paramN" value="N" />
</REQUEST>
'
Поскольку количество <param> запранее неизвестно, есть 2 способа, как можно создать такой xml-документ. Какой из них быстрее?
Имена и значения параметров PARAM лежат в массиве.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- СПОСОБ 1
-- создаём динамический ref cursor, куда вписываем значение
v_ref := 'select XMLElement("REQUEST",........';
for i in massiv.first .. massiv.last
loop
  v_ref:= v_ref || 'XMLElement("PARAM",.....'
end loop;
-- Делаем Fetch для динамического курсора и получаем XML документ (у меня 
-- этот вариант работает!)

-- СПОСОБ 2
-- создаём XML документ без <PARAM>
-- <PARAM> записываем через updateXML() в цикле пробегая по массиву Massiv
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369968
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Легко проверить, думаю, самое быстрый вариант будет заключаться в минимальном использовании объектов. Решил потренироваться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
declare
  type t_property is record (key varchar2( 64 ), value varchar2( 64 ));
  type tbl_property is table of t_property;
  vt_property tbl_property;
  v_sql varchar2( 32767 );
  xml XMLType;
  i integer;
  ts timestamp;
begin
  dbms_output.enable( 20000 );
  dbms_random.seed(sysdate);

  select rownum, trunc(dbms_random.value *  100 )
  bulk collect into vt_property
  from all_objects
    where rownum <=  300 ;
  -- 1
  ts := systimestamp; dbms_output.put_line('Start 1: '||ts);
  v_sql := '<REQUIEST>';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||'<PARAM name="'||vt_property(i).key||'" value="'||vt_property(i).value||'"/>';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||'</REQUIEST>';
  xml := XMLType(v_sql);
  dbms_output.put_line('End   1: '||systimestamp||' : '||((systimestamp - ts) day to second));
  --  2
  ts := systimestamp; dbms_output.put_line('Start 2: '||ts);
  v_sql := 'select XMLElement("REQUEST"';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||',XMLElement("PARAM",XMLAttributes('''||vt_property(i).key||''' as "name", '''||vt_property(i).value||''' as "value"))';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||') from dual';
  execute immediate v_sql into xml;
  dbms_output.put_line('End   2: '||systimestamp||' : '||((systimestamp - ts) day to second));
  -- 3
  ts := systimestamp; dbms_output.put_line('Start 3: '||ts);
  xml := XMLType('<REQUEST/>');
  i := vt_property.first;
  while vt_property.exists(i) loop
    select updateXml(
               XMLType('<REQUEST/>')
             , '/REQUEST'
             , XmlElement("REQUEST", XMLAgg(XmlElement("PARAM", XMLAttributes(''||vt_property(i).key||'' as "name", 'VALUE1_2' as "value"))))
           )
    into xml
    from dual;
    i := vt_property.next(i);
  end loop;
  dbms_output.put_line('End   3: '||systimestamp||' : '||((systimestamp - ts) day to second));
end;
/
Вот и гляди, для 300 параметров у меня следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
Start 1: 09.11.05 20:44:21.708170
End   1: 09.11.05 20:44:21.714328000 +03:00 : +000000000 00:00:00.006420000
Start 2: 09.11.05 20:44:21.714749
End   2: 09.11.05 20:44:21.732228000 +03:00 : +000000000 00:00:00.017736000
Start 3: 09.11.05 20:44:21.732637
End   3: 09.11.05 20:44:22.536805000 +03:00 : +000000000 00:00:00.804434000


Единственное, что первые два способа упираются в максимальный размер VARCHAR'а, т.е. 32767 для PL/SQL.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33370848
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovЛегко проверить, думаю, самое быстрый вариант будет заключаться в минимальном использовании объектов.

Спасибо!
Без комментариев
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33370866
Vadya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky Denis PopovЛегко проверить, думаю, самое быстрый вариант будет заключаться в минимальном использовании объектов.

Спасибо!
Без комментариев

Вообще с XML завязывать надо,
ни к чему это хорошему не приведет :-))
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371000
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov FlukkyИ ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?
В Оракле есть функция CONVERT для перекодировки строк.

Я тут с кодировками запутался.
База в кодировке LATVIAN_LATVIA.BLT8CP921
Создать XML документ с encoding="BLT8CP921" не получается, т.к. пишет "System does not support the specified encoding". Создаём XML с encoding="windows-1257". Всё работает.

Но теперь я не знаю, что писать в Convert. Кодировка другой базы, куда нужно послать XML документ - UTF-8.
Код: plaintext
1.
v_unicode_xml := xmltype(convert(p_xml.getStringVal(), 'CL8MSWIN1257', 'UTF8')) );
Ошибка: ORA-12703: this character set conversion is not supported
Код: plaintext
1.
v_unicode_xml := xmltype(convert(p_xml.getStringVal(), 'BLT8CP921', 'UTF8')) );
Ошибка: ORA-31011: XML parsing failed
LPX-00216: invalid character 128 (0x80)
Это если есть национальные симболы (отличные от латиницы). Если их нету, парсуется нормально.

Где-то в Интеренете есть список всех доступных кодировок для Convert? Наверное, для windows-1257 этот самый 'BLT8CP921' не подходит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371067
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и самое интересное... после того, как я делаю updateXML(), encoding="windows-1257" автоматически изменяется на encoding="UTF-8". Так должно быть?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371118
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в третем случае я накосячил, там идет постоянное обновление одного и того же экземпляра элемента "PARAM", а не добавление нового. Можно переписать следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
create or replace type t_property as object (key varchar2( 64 ), value varchar2( 64 ))
/
create or replace type tbl_property as table of t_property
/

declare
  vt_property tbl_property;
  v_sql varchar2( 32767 );
  xml XMLType;
  i integer;
  ts timestamp;
begin
  dbms_output.enable( 20000 );
  dbms_random.seed(sysdate);
  select cast(multiset (
           select rownum, trunc(dbms_random.value *  100 ) from all_objects where rownum <=  300 
         ) as tbl_property)
  into vt_property
  from dual;

  ts := systimestamp; dbms_output.put_line('Start 1: '||ts);
  v_sql := '<REQUIEST>';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||'<PARAM name="'||vt_property(i).key||'" value="'||vt_property(i).value||'"/>';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||'</REQUIEST>';
  xml := XMLType(v_sql);
  dbms_output.put_line('End   1: '||systimestamp||' : '||((systimestamp - ts) day to second));
  --  2
  ts := systimestamp; dbms_output.put_line('Start 2: '||ts);
  v_sql := 'select XMLElement("REQUEST"';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||
      ',XMLElement("PARAM",XMLAttributes('''||vt_property(i).key||''' as "name", '''||vt_property(i).value||''' as "value"))';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||') from dual';
  execute immediate v_sql into xml;
  dbms_output.put_line('End   2: '||systimestamp||' : '||((systimestamp - ts) day to second));
  -- 3
  ts := systimestamp; dbms_output.put_line('Start 3: '||ts);
  select updateXml(
               XMLType('<REQUEST/>')
             , '/REQUEST'
             , XmlElement(
                   "REQUEST"
                 , XMLAgg(XmlElement("PARAM", XMLAttributes(''||t.key||'' as "name", ''||t.key||'' as "value")))
               )
           )
  into xml
  from table(cast(vt_property as tbl_property)) t;
  dbms_output.put_line('End   3: '||systimestamp||' : '||((systimestamp - ts) day to second));
end;
/
Код: plaintext
1.
2.
3.
4.
5.
6.
Start 1: 10.11.05 13:25:47.306544
End   1: 10.11.05 13:25:47.312837000 +03:00 : +000000000 00:00:00.006548000
Start 2: 10.11.05 13:25:47.313239
End   2: 10.11.05 13:25:47.333826000 +03:00 : +000000000 00:00:00.020822000
Start 3: 10.11.05 13:25:47.334226
End   3: 10.11.05 13:25:47.371349000 +03:00 : +000000000 00:00:00.037393000


ИМХО: updateXML хорош для изменения существующего XML, но не для формирования нового.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371206
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyГде-то в Интеренете есть список всех доступных кодировок для Convert?
Код: plaintext
select * from v$nls_valid_values where parameter = 'CHARACTERSET';
Насчет перекодирования, к сожалению, мало чего могу сказать. У нас база создана в юникоде и оперируем мы документами исключительно в юникоде, почему, как мне думается, о некоторых проблемах перекодирования и работы с национальными кодировками я не догадываюсь:)

Flukkyи самое интересное... после того, как я делаю updateXML(), encoding="windows-1257" автоматически изменяется на encoding="UTF-8". Так должно быть?
Тут какая-то особенность приведения XMLType к строке Например, с использованием XMLType.getStringVal()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SQL> select updateXml(
   2              XMLType('<?xml version="1.0" encoding="Cp1251"?><ROOT><USERS/></ROOT>')
   3            , '/ROOT/USERS'
   4            ,  XmlElement("USERS", XMLAGG(XmlForest(user_id, username)))
   5          ) xml
   6   from all_users
   7   where username = user;

XML
----------------------------------------------------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1251"?>
<ROOT>
  <USERS>
    <USER_ID> 60 </USER_ID>
    <USERNAME>SCOTT</USERNAME>
  </USERS>
</ROOT>


SQL> select updateXml(
   2              XMLType('<?xml version="1.0" encoding="Cp1251"?><ROOT><USERS/></ROOT>')
   3            , '/ROOT/USERS'
   4            ,  XmlElement("USERS", XMLAGG(XmlForest(user_id, username)))
   5          ).getStringVal() xml
   6   from all_users
   7   where username = user;

XML
----------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
  <USERS>
    <USER_ID> 60 </USER_ID>
    <USERNAME>SCOTT</USERNAME>
  </USERS>
</ROOT>

О как. причем возможности указания кодировки вроде как нет.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371438
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov
Тут какая-то особенность приведения XMLType к строке Например, с использованием XMLType.getStringVal()


Видимо потому, что getStringVal() работает с CLOB, а кодировка CLOB в базе данных указывается не в 'NLS_CHARACTERSET', а в 'NLS_NCHAR_CHARACTERSET'. Могу ошибаться.

Что у Вас говорит такой запрос?
Код: plaintext
1.
2.
select * from V$NLS_PARAMETERS
where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

У меня:
NLS_CHARACTERSET = BLT8CP921
NLS_NCHAR_CHARACTERSET = UTF8

По-видимому, отсюда UTF8 и выплывает.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371488
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, Clob работает с первым параметром, а не с NCHAR...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371549
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня везде юникод, я упоминал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> select * from V$NLS_PARAMETERS
   2   where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

PARAMETER                                                        VALUE
---------------------------------------------------------------- -----
NLS_CHARACTERSET                                                 UTF8
NLS_NCHAR_CHARACTERSET                                           UTF8
Чего интересно: updateXML колдует с encoding даже если не используется getStringVal():
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> select updateXml(
   2              XMLType('<?xml version="1.0" encoding="Cp1251"?><ROOT><USERS/></ROOT>')
   3            , '/ROOT/USERS'
   4            ,  XmlElement("USERS", XMLAgg(XMLForest(user_id, username)))
   5          ) xml
   6   from all_users
   7   where username = user;

XML
---------------------------------------------------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1251"?>
<ROOT>
  <USERS>
    <USER_ID> 63 </USER_ID>
    <USERNAME>DAN</USERNAME>
  </USERS>
</ROOT>

Заметь: был Cp1251, стал WINDOWS-1251. Причем чтобы я ни пробовал вместо Cp1251: windows-1257, koi8-r, у меня вечно идет WINDOWS-1251. После чего изменил NLS_LANG на RU8PC866, переконнектился: и теперь всегда стал возвращаться CP866.

То есть, на мой взгляд, получается следующее: updateXML строит новый документ с кодировкой клиента и наполняет его данными. В случае отсутствия клиента (как, например, работа через Java Thin-драйвер) берется кодировка БД.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420037
h00f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.

У меня вопрос, очень бы хотелось бы получить ответ. Я с Ораклом работаю недавно (больше программер).

Собственно проблема.

Мне нужно распарсить XMLType с документами XML и как результат разложить в таблицы.

Я пользую парсер который выкладывался сдесь на борде.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
CREATE OR REPLACE PROCEDURE "XMLPARS" AS
BEGIN

DECLARE
  l_doc      DBMS_XMLDOM.DOMDocument;  -- основной DOM-документ
  vmarker int; -- temp
  zvk XMLType;
  -- Процедура вывода атрибутов узла
  PROCEDURE ShowNodeAttributes(i_node IN DBMS_XMLDOM.DOMNode)
  IS
    l_nattrs DBMS_XMLDOM.DOMNamedNodeMap;  -- список атрибутов узла
    l_node   DBMS_XMLDOM.DOMNode;          -- узел с типом - атрибут
    l_sattrs VARCHAR2( 2000 );               -- текстовое описание атрибутов
  BEGIN
    -- получить атрибуты узла
    l_nattrs := DBMS_XMLDOM.GetAttributes(i_node);
    
    -- вывести имена атрибутов и их значения одной строкой
    IF NOT DBMS_XMLDOM.isNull(l_nattrs) THEN
      FOR i IN  0 ..DBMS_XMLDOM.GetLength(l_nattrs)- 1  LOOP
        l_node    := DBMS_XMLDOM.item(l_nattrs,i);
        l_sattrs  := l_sattrs||DBMS_XMLDOM.GetNodeName(l_node)||'="'
                     ||DBMS_XMLDOM.GetNodeValue(l_node)||'" ';
      END LOOP;
      dbms_output.put_line('Attrs: '||l_sattrs);              
    END IF;   
  END;
  
  -- Рекурсивная процедура построения дерева DOM документа
  PROCEDURE RecursiveTree(i_node IN DBMS_XMLDOM.DOMNode)
  IS
    l_nlist DBMS_XMLDOM.DOMNodeList;  -- Список дочерних узлов
    l_node  DBMS_XMLDOM.DOMNode;      -- текущий узел 
    l_nval  VARCHAR2( 2000 );           -- значение узла
  BEGIN
    -- откроем описание узла
    dbms_output.put_line('Start: '||DBMS_XMLDOM.getNodeName(i_node));
    
    -- если значение узла NULL, пропустим его
    l_nval := DBMS_XMLDOM.getNodeValue(i_node);
    IF l_nval IS NOT NULL THEN
       dbms_output.put_line('Value: '||l_nval);
    END IF;
    
    -- Вывести атрибуты узла
    ShowNodeAttributes(i_node);
    
    -- для дочерних узлов, узла, рассматриваемого в текущий момент
    l_nlist := DBMS_XMLDOM.getchildnodes(i_node);
    
    -- повторить выполненные действия   
    IF NOT DBMS_XMLDOM.isNull(l_nlist) THEN
       FOR i IN  0 ..DBMS_XMLDOM.getLength(l_nlist)- 1  LOOP           
          l_node := DBMS_XMLDOM.item(l_nlist,i);         
          RecursiveTree(l_node); 
       END LOOP; 
    END IF;
    
    -- закроем описание узла
    dbms_output.put_line('Endof: '||DBMS_XMLDOM.getNodeName(i_node));   
  END;
BEGIN
-- инициализация документа
/*   l_doc := DBMS_XMLDOM.newdomdocument(XMLType('
--<bookshelf>
  <book name="А Таle Of Two Cities" author="Dickens">
    <part n="1">Recalled to Life</part>
    <part n="2">The Golden Thread</part>
    <part n="3">A Track of A storm</part>
  </book>
  <book name="Great Expectations" author="Dickens">
    <part contents="no info"/>
  </book>
</bookshelf>'));  
*/   
   -- построение дерева

  
--  select xmlzvk into zvk from r_mail where marker=820987247469933;
  select description into zvk from books1 where marker= 1 ;
  l_doc := DBMS_XMLDOM.newdomdocument(zvk);
   RecursiveTree(DBMS_XMLDOM.makeNode(l_doc));
END; 
END;

Получаю результат. Проблема в том, что я НЕМОГУ НАЙТИ решение КАК мне разложить результаты в реляционные таблицы. Я не знаю заранее какому тэгу соответствует какое поле и его тип. Я сделал XMLSchema документ с нотацией Oracle (насколько я смог разобраться с ней) в надежде что это поможет решить данную проблему.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0" encoding="Windows-1251"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" elementFormDefault="qualified" attributeFormDefault="unqualified" xdb:storeVarrayAsTable="true">
  <xs:include schemaLocation="v01-CODES-RUSSIA.xsd"/>
  <xs:include schemaLocation="v01-TYPES-RUSSIA.xsd"/>
  <xs:element name="Msg" xdb:defaultTable="R_ZAY">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ForInfo" type="ForInfoCODES" xdb:SQLName="FORINFO" xdb:SQLType="VARCHAR2"/>
        <xs:element name="Enterprise" type="EnterpriseTYPE" xdb:SQLName="ENTERPRISE" xdb:SQLType="VARCHAR2"/>
        <xs:element name="SelfNumber" type="SelfNumberTYPE" xdb:SQLName="SELF_NUMBER" xdb:SQLType="NUMBER"/>        
        
-----8<---------SKIP------>8------

        <xs:element name="Notes" type="NotesTYPE" minOccurs="0" xdb:defaultTable="R_NOTES"/>
        <xs:element name="Text" type="TextTYPE" minOccurs="0" xdb:SQLName="TEXT" xdb:SQLType="VARCHAR2"/>
      </xs:sequence>
      <xs:attribute name="type" type="TypeCODES" xdb:SQLName="ID_MTYPE" xdb:SQLType="VARCHAR2"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

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

Был бы БЕЗМЕРНО ПРИЗНАТЕЛЕН за помощь с решением данной проблемы. Я просто в одиночку разруливаю эту задачу..

По системе Oracle 10.1.0
icq:168815113

Сорри если ламерские вопросы..
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420525
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
h00fПолучаю результат. Проблема в том, что я НЕМОГУ НАЙТИ решение КАК мне разложить результаты в реляционные таблицы. Я не знаю заранее какому тэгу соответствует какое поле и его тип. Я сделал XMLSchema документ с нотацией Oracle (насколько я смог разобраться с ней) в надежде что это поможет решить данную проблему.

А чем же в конечном счете определяется, что куда должно попасть?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420676
h00f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я посчитал, что использование XMLSchema + нотации Oracle позволят сделать некий универсальный механизм по загрузке. Я просто не понимаю, как еще можно прописать куда должно записываться содержимое тэга, как реализовать хранение контейнера, при условии что типов сообщений порядка 36!

Проблема в том, что часть проекта связанная с парсингом и накоплением дожна быть максимально универсальной т.к. (12 типов сообщений по почте, 24 типа по SOAP планируется + куча алгоритмов заимодействия и последующая реализация WSA). Я поднял XMLSchema для валидации XML сообщений, насколько смог разобрал нотации Oracle в этой части в надежде, что используя XMLSchema (XSDL) и XMLType с XML документами смогу нормально разложить в базу. Но столкнулся с тем что я НЕ ПОНИМАЮ КАК пользовать парсер с XMLSchema + XML.
PL/SQL учу но опыта мало, Java не знаю, да Oracle Application Server не стоит ишо.

Наверное звучит глупо и много всего, но блин нада делать а у мя бошка кругом от всего в особенности этого парсинга с загрузкой в таблицы.. Сотни вопросов.. Сорри понесло ..
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420714
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот тоже думал, что есть нечто навороченное, наподобе пары пакетов DBMS_XMLGEN -> DBMS_XMLSAVE (в 10-ке добавили DBMS_XMLSTORE, реализованный чисто на C, что обещает быть быстрее DBMS_XMLSAVE c Java): http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14259/xdb_dbmstore.htm#sthref1413

It takes a canonical XML mapping similar to that produced by package DBMS_XMLGEN; converts it to object-relational constructs; and inserts, updates or deletes the value from relational tables.
Т.е. есть некий "канонический" XML, который всегда можно запихать в таблицу не гадая о том, какие в XML и таблице поля, закладываясь на то, что они совпадают. Получается одна процедура на заливку всех таблиц из xml. Как следует выкручиваться, если XML не "каконический" - вопрос, который бы хотелось прояснить. Пока все варианты сводятся к тому, что для обработкий каждой таблицы пишется свой код, либо делается опять же свой разборщик приходящего XML.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33445621
h00f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть интересный пример по мапингу XML.. одна проблема пример загрузки XML приведен на Java на Pl/sql нетути .. к сожалению. .

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
Object Views
If an XML document is not in the canonical format, you can create object views or XMLType views, to allow XSU to map XML documents to database tables. In the following contact.xml XML document, the contact information is stored as follows:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<Contact_List>
 <Contact>
  <User_id>userid</User_id>
  <First_Name>Steve</First_Name>
  <Last_Name>Jones</Last_Name>
  <Business>
   <Email>Steve.Jones@oracle.com<;/Email>
   <Phone>( 650 ) 5769801 </Phone>
   <Address>
    <Street1>4op11</Street1>
    <Street2> 500  Oracle Parkway</Street2>
    <City>Redwood Shores</City>
    <State>CA</State>
    <Zipcode> 94065 </Zipcode>
    <Country>USA</Country>
   </Address>
  </Business>
 </Contact>
</Contact_List>

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
The database schema is defined as follows:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TYPE address_typ AS OBJECT(
  street1 VARCHAR2( 200 ), 
  street2 VARCHAR2( 200 ), 
  city VARCHAR2( 100 ), 
  state VARCHAR2( 20 ), 
  zipcode VARCHAR2( 20 ), 
  country VARCHAR2( 20 )); 
/
CREATE TABLE contact_tbl(
  contactid VARCHAR2( 15 ) PRIMARY KEY, 
  firstname VARCHAR2( 100 ), 
  lastname VARCHAR2( 200 ), 
  midname VARCHAR2( 50 ), 
  business_phone VARCHAR2( 20 ), 
  home_phone VARCHAR2( 10 ), 
  cell_phone VARCHAR2( 20 ), 
  business_addr address_typ, 
  business_email VARCHAR2( 150 ));

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
Using the canonical mapping, the XML document cannot directly map to the table columns as the document contains multiple levels; thus, to insert this XML document, you need to create the following object view:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TYPE contactinfo_type AS OBJECT(
   phone VARCHAR2( 20 ),
   email VARCHAR2( 150 ),
   address address_typ);
/
 -- Create Object View
CREATE VIEW contact_view AS
   SELECT contactid AS user_id, firstname AS first_name, lastname AS
     last_name,midname AS mid_name,
     contactinfo_type(business_phone,business_email,
     business_addr) AS business
   FROM contact_tbl;

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
Then, you can run a similar command to load the XML file into CUSTOMER_VIEW:


Код: plaintext
1.
2.
java OracleXML putXML -conn "jdbc:oracle:thin:@localhost:1521:orclX"
 -user "demo/demo" -fileName "contacts.xml" "contact_view"

Я как довольно слабый в части pl/sql не могу понять можно ли с помощью данного решения решить проблему хранения XML сообщений смешанной структуры (вертикальная+горизонтальная) с хорошей степенью вложенности контейнеров..

И еще как посредством pl/sql сделать мапинг XML таки в эту конструкцию...

Извиняюсь на назойливость.. Но проект горит и уже сзати попахивает паленным.. Сорри
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33460210
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появился ещё один вопрос по разборке XML.
Вопрос такой. Можно ли каким-то образом написать, приведённый ниже, запрос без использования union. Нужно учитывать, что в XML документе может отсутствовать как первая часть <PROCEDURE name="DATA_1"> так и вторая <PROCEDURE name="DATA_2">. В обычном запросе это бы решилось с помощью (+).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
select
     'x' as source
    ,x.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,x.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,null  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_1"]'))) x

union

select
     'y' as source
    ,y.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,y.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,y.extract('//PARAM[@name="3"]/@value').getStringVal()  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_2"]'))) y
where extractValue(value(y),'//PARAM[@name="3"]/@value') = '1';

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33460324
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если может отсутствовать как первая, так и вторая части, то (+)-ом ИМХО не отделаешься, это уже напоминает FULL OUTER JOIN.

Раз их может не быть - вставь их самостоятельно, чтобы были наверняка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select case procedure_name when 'DATA_1' then 'x' when 'DATA_2' then 'y' end source
     , max(param_1) param_1
     , max(param_2) param_2
     , max(param_3) param_3
from (select x.extract('//PROCEDURE/@name').getStringVal() procedure_name
           , x.extract('//PROCEDURE/PARAM[@name="1"]/@value').getStringVal() param_1
           , x.extract('//PROCEDURE/PARAM[@name="2"]/@value').getStringVal() param_2
           , x.extract('//PROCEDURE/PARAM[@name="3"]/@value').getStringVal() param_3
      from table(XMLSequence(XMLType(
'<RESPONCE>
 <PROCEDURE name="DATA_1">
  <PARAM name="1" value="AAA" />
  <PARAM name="2" value="100" />
 </PROCEDURE>
 <PROCEDURE name="DATA_2">
  <PARAM name="1" value="AAA" />
  <PARAM name="2" value="200" />
  <PARAM name="3" value="1" />
 </PROCEDURE>
</RESPONCE>').extract('/RESPONCE/PROCEDURE'))) x
      union all
      select 'DATA_1', null, null, null from dual
      union all
      select 'DATA_2', null, null, null from dual
     )
group by procedure_name;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33463712
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробую!
В случае с union почему-то вылетает ошибка
ORA-22905: cannot access rows from a non-nested table item

Есть идеи, почему? Смоделировать такую ситуацию для тестового примера пока не получается.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33463818
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
        select
             'x'  as source
            ,'1' as order_by
            ,'1' as id
            ,'1' as p
            ,to_date('01.01.1900','dd.mm.yyyy') as chng_date
            ,'1' as chng_r
            ,'1' as chng_code
            ,'1' as dtype
            ,'1' as dcode
            ,'1' as no
            ,to_date('01.01.1900','dd.mm.yyyy') as issue_date
            ,to_date('01.01.1900','dd.mm.yyyy') as expire_date
            ,'1' as country
            ,'1' as country2
            ,'1' as offc
            ,'1' as offcc
            ,'1' as offct
        from
             table(XMLSequence(cp_xml.extract('RESPONSE/PROCEDURE[@name="DATA_1"]')))  x
        union
        select
             'y'  as source
            ,'1' as order_by
            ,'1' as id
            ,'1' as p
            ,to_date('01.01.1900','dd.mm.yyyy') as stat_chng_date
            ,'1' as chng_r
            ,'1' as chng_code
            ,'1' as dtype
            ,'1' as dcode
            ,'1' as no
            ,to_date('01.01.1900','dd.mm.yyyy') as issue_date
            ,to_date('01.01.1900','dd.mm.yyyy') as expire_date
            ,'1' as country
            ,'1' as country2
            ,'1' as offc
            ,'1' as offcc
            ,'1' as offct
        from
             table(XMLSequence(cp_xml.extract('RESPONSE/PROCEDURE[@name="DATA_2"]'))) Y

Такое вызывает ORA-22905
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33463852
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка появляется независимо от количества параметров. Инетресно, что в SQL*Plus такой запрос работает, а внутри процедуры - нет!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464384
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В предыдущих примервх был RESPON C E, теперь стал RESPOR S E - так и должно быть?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464461
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этим всё в порядке, описка просто
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464467
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464728
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну по-скольку 9-ый Оракл что-то бастует и не хочет работать с XMLType и Union, ваш, Денис, вариант нахожу переспективным. Но как создать селект без union, если в запрос добавляется параметр order_by (числа 11 и 22 - могут быть любыми)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
select
     'x' as source
    ,case when x.extract('//PARAM[@name="2"]/@value').getStringVal() =  11  then '1' else '3' end as order_by
    ,x.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,x.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,null  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_1"]'))) x

union

select
     'y' as source
    ,case when y.extract('//PARAM[@name="2"]/@value').getStringVal() =  22  then '2' else '4' end as order_by
    ,y.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,y.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,y.extract('//PARAM[@name="3"]/@value').getStringVal()  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_2"]'))) y
where extractValue(value(y),'//PARAM[@name="3"]/@value') = '1';

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464757
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, поясни, чем не нравится вышеприведенный вариант? Во-вторых, почему UNION, а не UNION ALL, раз запросы наверняка разнятся? При использовании последнего ИМХО можно заложиться, что UNION ALL порядок записей не меняет. И, напоследок, что мешает использовать CASE в ORDER BY?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464781
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу union all согласен.

Почему нельзя case в order by:

В XML от процедуры DATA_1 есть строки с определёнными значениями параметров param_2:
- тоесть если param_2 принадлежит какому-то множеству (в примере числу 11), такие строки выводить первыми.
- другие строки выводить третими по счёту

В XML от процедуры DATA_2 есть строки с определёнными значениями параметров param_2 (но эти значения НЕ ТАКИЕ как в первой процедуре):
Выводим соответственно вторыми и четвёртыми по счёту.

Чтобы в итоге получилось:
данные_процедуры_1
данные_процедуры_2
данные_процедуры_1
данные_процедуры_2

Этот порядок очень важен. XML писал не я, не могу на него повлиять в данном случае.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464791
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо нужна функция
function get_ortder_by(source,param2) return number
:)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464838
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал функцию, создал селект без union (похожий на тот, что привёл Денис) и никак проблем. Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833063
lav_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, но никак не могу понять как имя такой примерно select:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select d.extract('/ATTRIBUTE/@id').getStringVal() surname,'имя package' package
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE id="PERS_ID"  value="1111" />
      <ATTRIBUTE id="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE id="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE id="PERS_ID" value="2222" />
      <ATTRIBUTE id="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE id="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY/ATTRIBUTE'))) d;


Получить Entity name рядом с каждым id Атрибута???
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833209
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу вот так, а не работает, помогите плиз.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('/ATTRIBUTE/@id').getStringVal() surname,d.extract('../ENTITY/@name').getstringval() package
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE id="PERS_ID" name="1" value="1111" />
      <ATTRIBUTE id="FIRST_NAME" name="2" value="OLGA" />
      <ATTRIBUTE id="SURNAME" name="3" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE id="PERS_ID" name="4" value="2222" />
      <ATTRIBUTE id="FIRST_NAME" name="5" value="ANNA" />
      <ATTRIBUTE id="SURNAME" name="6" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY/ATTRIBUTE'))) d;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833210
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/topic/300566
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833536
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Помогло.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34046528
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся на статью об SQL/XML в Оракле. Описываются основные функции, новые возможности 10g, примеры, known issues, bugs, присутствуют ссылки на доку, короче XML in Oracle by Example.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188059
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY'))) d;


На одной СУБД Oracle этот запрос проходит, на другой нет:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

Oracle 9.2.0.1.0, если я правильно понял.

Патч?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188095
for93t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно увидеть результат
Код: plaintext
select * from v$version
?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188096
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for93tМожно увидеть результат
Код: plaintext
select * from v$version
?
Конечно:

Код: plaintext
1.
2.
3.
4.
5.
6.
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 1 . 0  - Production
PL/SQL Release  9 . 2 . 0 . 1 . 0  - Production
CORE	 9 . 2 . 0 . 1 . 0 	Production
TNS for  32 -bit Windows: Version  9 . 2 . 0 . 1 . 0  - Production
NLSRTL Version  9 . 2 . 0 . 1 . 0  - Production

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188101
for93t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем я тоже сижу репу чешу, ничего не понимаю. Ваш пример у меня вообще обрывает сессию, хотя синтаксис правильный. Я и сам сейчас сижу, пытаюсь решить подобную задачку, но как-то ничего не получается. Вот мои баннеры:
Код: plaintext
1.
2.
3.
4.
5.
6.
BANNER
----------------------------------------------------------------
Personal Oracle9i Release  9 . 2 . 0 . 5 . 0  - Production
PL/SQL Release  9 . 2 . 0 . 5 . 0  - Production
CORE     9 . 2 . 0 . 6 . 0        Production
TNS for  32 -bit Windows: Version  9 . 2 . 0 . 5 . 0  - Production
NLSRTL Version  9 . 2 . 0 . 5 . 0  - Production
Оракл домашний. На работе с 7 патчсетом. Все подобное отрабатывает на раз. Да и на 9.2.0.2 тоже все отлично работало. Ниччего не понимаю!!!
Будем ждать более опытных товарищей...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188114
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И на моей работе такой как Вас Оракл стоит. Проблем никаких!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188116
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всмысли 7.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34514701
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появился ещё вопрос.
Есть XML, который использует несколько пространств имён.
Код: plaintext
1.
2.
3.
4.
5.
6.
<n1:MyResp xmlns:n1="http://testws/ns1">
 <n1:Result>OK</n1:Result>
 <n2:TestNode xmlns:n2="http://testws/ns2">
   <n2:SubResult>OK2</n2:SubResult>
 </n2:TestNode>
</n1:Resp>

Как его разбирать extract'ом? Указывая только имена элементов MyResp, Result, TestNode, SubResult, либо каждый элемент нужно писать вместе с пространством имён: n1:MyResp/n2:TestNode/n2:SubResult' ?

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34515673
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
alp@uni>; edit
Wrote file afiedt.buf

   1   with t as (
   2       select xmltype('<xmldoc xmlns:n1="http://testws/ns1" xmlns:n2="http://testws/ns2">
  3       <n1:Result>OK</n1:Result>
  4       <n2:TestNode>
  5         <n2:SubResult>OK2</n2:SubResult>
  6       </n2:TestNode>
  7      </xmldoc>') x from dual)
   8 * select extract(x,'//Result/text()', 'xmlns="http://testws/ns1"').getstringval() r from t
alp@uni>; /

R
----------------------------------------------------------------------------------------------------
OK
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516422
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А откуда появился таг "<xmldoc xmlns:n1="http://testws/ns1" xmlns:n2="http://testws/ns2">"?

Я вот так вот пробую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
    select
    xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
         <n1:Result>OK</n1:Result>
         <n2:TestNode xmlns:n2="http://testws/ns2">
           <n2:SubResult>OK2</n2:SubResult>
         </n2:TestNode>
        </n1:MyResp>
') x
    from dual
)
select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns2"') data from t;
Ничего не возвращает. Если указывать namespace ns1 - так же ничего не происходит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516468
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если попробывать запустить такой запрос пару раз, вылетает:
Код: plaintext
1.
ORA- 03118 : two-task coroutine has invalid state

Описание:
Cause: This is an internal error message not usually issued.
Action: Contact Oracle Support Services.

:(
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516512
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> with t as (
   2       select
   3       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4           <n1:Result>OK</n1:Result>
  5           <n2:TestNode xmlns:n2="http://testws/ns2">
  6             <n2:SubResult>OK2</n2:SubResult>
  7           </n2:TestNode>
  8          </n1:MyResp>
  9  ') x
  10       from dual
  11   )
  12   select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns2"') data from t;

DATA                                                                            
--------------------------------------------------------------------------------
                                                                                

SQL> ed
Wrote file afiedt.buf

   1   with t as (
   2       select
   3       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4           <n1:Result>OK</n1:Result>
  5           <n2:TestNode xmlns:n2="http://testws/ns2">
  6             <n2:SubResult>OK2</n2:SubResult>
  7           </n2:TestNode>
  8          </n1:MyResp>
  9  ') x
  10       from dual
  11   )
  12 * select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns1"') data from t
SQL> /*
DOC>izmenil namespace v extract()
DOC>*/
SQL> /
ERROR:
ORA- 31011 : XML parsing failed 

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516514
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyЕсли попробывать запустить такой запрос пару раз, вылетает:
Код: plaintext
1.
ORA- 03118 : two-task coroutine has invalid state

Описание:
Cause: This is an internal error message not usually issued.
Action: Contact Oracle Support Services.

:(

Ошибка появляется только в туле, с которым я работал. В Sql*Plus её нет!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516636
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky
Я вот так вот пробую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
    select
    xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
         <n1:Result>OK</n1:Result>
         <n2:TestNode xmlns:n2="http://testws/ns2">
           <n2:SubResult>OK2</n2:SubResult>
         </n2:TestNode>
        </n1:MyResp>
') x
    from dual
)
select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns2"') data from t;
Ничего не возвращает. Если указывать namespace ns1 - так же ничего не происходит.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
alp@uni>; edit
Wrote file afiedt.buf

   1   with t as (
   2       select
   3       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4           <n1:Result>OK</n1:Result>
  5           <n2:TestNode xmlns:n2="http://testws/ns2">
  6             <n2:SubResult>OK2</n2:SubResult>
  7           </n2:TestNode>
  8          </n1:MyResp>
  9  ') x
  10       from dual
  11   )
  12 * select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns1"').getstringval() data from t
alp@uni>; /

DATA
----------------------------------------------------------------------------------------------------
OK

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516727
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!

Возвращая результат как текст, он, наконец, появляется и у меня.

А как вернуть значение элемента SubResult? Пробую так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> /* seichas hotim poluchitj SubResult*/
SQL> ed
Wrote file afiedt.buf

   1     with t as (
   2         select
   3         xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4             <n1:Result>OK</n1:Result>
  5             <n2:TestNode xmlns:n2="http://testws/ns2">
  6               <n2:SubResult>OK2</n2:SubResult>
  7             </n2:TestNode>
  8            </n1:MyResp>
  9    ') x
  10         from dual
  11     )
  12 * select extract(x,'MyResp//TestNode/SubResult/text()','xmlns="http://testws/ns1"').getstringval() data from t
SQL> /

DATA
--------------------------------------------------------------------------------


Результата нет и с 'xmlns="http://testws/ns2.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34516788
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас 2 разных пространства, имхо либо вложеным extract'ом, либо так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
alp@uni>; edit
Wrote file afiedt.buf

   1   with t as (
   2           select
   3           xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
  4               <n1:Result>OK</n1:Result>
  5               <n2:TestNode xmlns:n2="http://testws/ns2">
  6                 <n2:SubResult>OK2</n2:SubResult>
  7               </n2:TestNode>
  8              </n1:MyResp>
  9      ') x
  10           from dual
  11       )
  12 * select extract(x,'//TestNode/SubResult/text()','xmlns="http://testws/ns2"').getstringval() data from t
alp@uni>; /

DATA
----------------------------------------------------------------------------------------------------
OK2
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34517016
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо! Идея понятна!
А если задачу усложнить тем, что мы не знаем конкретного адреса namespace, однако известно, что они разные.
Начал реализовывать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
declare
    d1  varchar2( 10 );
    d2  varchar2( 10 );
    xml      xmltype;
    sub_xml  xmltype;
    my_namespace1  varchar2( 300 );
    my_namespace2  varchar2( 300 );
    function get_namespace(p_xml  in xmltype)
    return varchar2
    is
    begin
        return('xmlns="'||
            p_xml.transform(
                xmltype(
            '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              <xsl:template match="/*">
                <xsl:value-of select="namespace-uri(.)"/>
              </xsl:template>
            </xsl:stylesheet>'
                )
              ).getStringVal()||'"'
        );
    end get_namespace;
begin

    xml :=       xmltype('<n1:MyResp xmlns:n1="http://testws/ns1">
           <n1:Result>OK</n1:Result>
           <n2:TestNode xmlns:n2="http://testws/ns2">
             <n2:SubResult>OK2</n2:SubResult>
           </n2:TestNode>
          </n1:MyResp>
  ');

    my_namespace1 := get_namespace(xml);
    dbms_output.put_line('my_namespace1 = '||my_namespace1);

    -- zdesj chto-to ne tak...
    sub_xml := xml.extract('MyResp',my_namespace1);
--    dbms_output.put_line(sub_xml.getStringVal());
    --/

    my_namespace2 := get_namespace(sub_xml);
    dbms_output.put_line('my_namespace2 = '||my_namespace2);

 with t as (
      select xml
 x
      from dual
  )
select extract(x,'MyResp//Result/text()','xmlns="http://testws/ns1"').getstringval() data1
      ,extract(x,'//TestNode/SubResult/text()','xmlns="http://testws/ns2"').getstringval()  data2
into d1, d2
from t;

dbms_output.put_line('without additional namespace function');
dbms_output.put_line('d1 = '||d1);
dbms_output.put_line('d2 = '||d2);

dbms_output.put_line('with additional namespace function');

d1:= null; d2:= null;

 with t as (
      select
            xml x
      from dual
  )
select extract(x,'MyResp//Result/text()',my_namespace1).getstringval() data1
      ,extract(x,'//TestNode/SubResult/text()',my_namespace2).getstringval()  data2
into d1, d2
from t;

dbms_output.put_line('d1 = '||d1);
dbms_output.put_line('d2 = '||d2);

end;
/


my_namespace1 = xmlns="http://testws/ns1"
my_namespace2 = xmlns="http://testws/ns1"
without additional namespace function
d1 = OK
d2 = OK2
with additional namespace function
d1 = OK
d2 =

PL/SQL procedure successfully completed.

SQL> 


Как мне вытянуть внутренний namespace ns2?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34567695
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> select
   2        x.extract('v4:MyResp/CarList/@v3:servicename').getStringVal() as service_name
   3       ,x.extract('v4:MyResp/CarList/v2:Car/v2:Mark/text()').getStringVal() as car_mark
   4   from
   5       table(
   6           XMLSequence(
   7               xmltype('
  8                  <v4:MyResp xmlns="http://testserver/v1"
  9                             xmlns:v2="http://testserver/v2"
 10                             xmlns:v3="http://testserver/v3"
 11                             xmlns:v4="http://testserver/v4" >
 12                      <CarList v3:servicename="Auvtoservis 123">
 13                          <v2:Car>
 14                              <v2:Mark>AUDI</v2:Mark>
 15                          </v2:Car>
 16                      </CarList>
 17                  </v4:MyResp>
 18              ').extract('v4:MyResp','
 19                                              xmlns="http://testserver/v1"
 20                                              xmlns:v2="http://testserver/v2"
 21                                              xmlns:v3="http://testserver/v3"
 22                                              xmlns:v4="http://testserver/v4"')
  23           )
  24       ) x;

SERVICE_NAME
--------------------------------------------------------------------------------
CAR_MARK
--------------------------------------------------------------------------------




SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 6 . 0  - Production
PL/SQL Release  9 . 2 . 0 . 6 . 0  - Production
CORE     9 . 2 . 0 . 6 . 0        Production
TNS for Linux: Version  9 . 2 . 0 . 6 . 0  - Production
NLSRTL Version  9 . 2 . 0 . 6 . 0  - Production

Что тут не так?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34567836
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 7 . 0  - Production

SQL> 
select
      x.extract('v4:MyResp/CarList/@v3:servicename','xmlns="http://testserver/v1" xmlns:v4="http://testserver/v4" xmlns:v3="http://testserver/v3"').getStringVal() as service_name
     ,x.extract('v4:MyResp/CarList/v2:Car/v2:Mark/text()','xmlns="http://testserver/v1" xmlns:v2="http://testserver/v2" xmlns:v4="http://testserver/v4"').getStringVal() as car_mark
 from
     table(
         XMLSequence(
             xmltype('
                 <v4:MyResp xmlns="http://testserver/v1"
                            xmlns:v2="http://testserver/v2"
                            xmlns:v3="http://testserver/v3"
                            xmlns:v4="http://testserver/v4" >
                     <CarList v3:servicename="Auvtoservis 123">
                         <v2:Car>
                             <v2:Mark>AUDI</v2:Mark>
                         </v2:Car>
                     </CarList>
                 </v4:MyResp>
             ').extract('v4:MyResp','xmlns:v4="http://testserver/v4"')
         )
     ) x;

SERVICE_NAME                                                                     CAR_MARK
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Auvtoservis  123                                                                   AUDI
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34567965
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот пример, мне видится, более наглядным для демонстрации механизма пространства имен.
Ты можешь сам алиасить URI пространства имен, как тебе заблагорасудится. И пофик алиасы, которые расставлены в тексте XML
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
elect
      x.extract('foo1:MyResp/foo2:CarList/@foo3:servicename','xmlns:foo2="http://testserver/v1"
                                                              xmlns:foo1="http://testserver/v4"
                                                              xmlns:foo3="http://testserver/v3"').getStringVal() as service_name
     ,x.extract('bar1:MyResp/bar2:CarList/bar3:Car/bar3:Mark/text()','xmlns:bar2="http://testserver/v1"
                                                                      xmlns:bar3="http://testserver/v2"
                                                                      xmlns:bar1="http://testserver/v4"').getStringVal() as car_mark
 from
     table(
         XMLSequence(
             xmltype('
                 <v4:MyResp xmlns="http://testserver/v1"
                            xmlns:v2="http://testserver/v2"
                            xmlns:v3="http://testserver/v3"
                            xmlns:v4="http://testserver/v4" >
                     <CarList v3:servicename="Auvtoservis 123">
                         <v2:Car>
                             <v2:Mark>AUDI</v2:Mark>
                         </v2:Car>
                     </CarList>
                 </v4:MyResp>
             ').extract('MyResp','xmlns="http://testserver/v4"')
         )
     ) x;

SERVICE_NAME                                                                     CAR_MARK
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Auvtoservis  123                                                                   AUDI
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34571764
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновили базу до 9.2.0.7.0 - заработал!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34575443
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zloxa, спасибо про объяснения с алиасами - это как раз то, что надо. Разработчики веб-сервиса утверждают, что будут меняться только имена алиасов. Поэтому, пока могу ограничиться определением своих алиасов.

Теперь вопрос. Есть такой XML:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID> 1 </v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID> 2 </v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>

Нужно найти все CarID.

Попытка 1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select
     x.extract('Level_1:Resp/Level_2:List/Level_3:Item/Level_3:CarID/text()','xmlns:Level_1="http://testserver/v1"
                                                                 xmlns:Level_2="http://testserver/v2"
                                                                 xmlns:Level_3="http://testserver/v3"') as car_id
from
    table(
        XMLSequence(
            xmltype('
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID>1</v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID>2</v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>
            ')
        )
    ) x

CAR_ID
--------------------------------------------------------------------------------
 12 


Удаётся найти значения, но они все выстраиваются в одну строку.

Попытка 2:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
select
     x.getStringVal()
from
    table(
        XMLSequence(
            xmltype('
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID>1</v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID>2</v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>
            ').extract('Level_1:Resp/Level_2:List/Level_3:Item','xmlns:Level_1="http://testserver/v1"
                                                                 xmlns:Level_2="http://testserver/v2"
                                                                 xmlns:Level_3="http://testserver/v3"')
        )
    ) x

X.GETSTRINGVAL()
--------------------------------------------------------------------------------
<v3:Item>
  <v3:CarID> 1 </v3:CarID>
</v3:Item>

<v3:Item>
  <v3:CarID> 2 </v3:CarID>
</v3:Item>

-- теперь пробуем вытянуть значения CarID

select
     x.extract('Level_3:Item/Level_3:CarID/text()','xmlns:Level_3="http://testserver/v3"') as car_id
from
    table(
        XMLSequence(
            xmltype('
    <v1:Resp
            xmlns:v1="http://testserver/v1"
            xmlns="http://testserver/v2"
            xmlns:v3="http://testserver/v3">
      <List>
        <v3:Item>
          <v3:CarID>1</v3:CarID>
        </v3:Item>
        <v3:Item>
          <v3:CarID>2</v3:CarID>
        </v3:Item>
      </List>
    </v1:Resp>
            ').extract('Level_1:Resp/Level_2:List/Level_3:Item','xmlns:Level_1="http://testserver/v1"
                                                                 xmlns:Level_2="http://testserver/v2"
                                                                 xmlns:Level_3="http://testserver/v3"')
        )
    ) x

ERROR:
ORA- 31011 : XML parsing failed
ORA- 19202 : Error occurred in XML processing
LPX- 00234 : namespace prefix "v3" is not declared
Error at line  1 
ORA- 06512 : at "SYS.XMLTYPE", line  0 
ORA- 06512 : at line  1 



no rows selected

Как обойти эту ошибку, чтобы вытащить нужные значения:
1
2

?

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34575775
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему метод Extract, в отличии от фунции Extract не спускает в извлеченный фрагмент разименование алиасов - не знаю, может быть баг, может фича, но так - работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
select
     extractValue(value(x),'Level_3:CarID','xmlns:Level_3="http://testserver/v3"') as car_id
from
    table(
        XMLSequence(
            extract(xmltype(' <v1:Resp
                                      xmlns:v1="http://testserver/v1"
                                      xmlns="http://testserver/v2"
                                      xmlns:v3="http://testserver/v3">
                                <List>
                                  <v3:Item>
                                    <v3:CarID>1</v3:CarID>
                                  </v3:Item>
                                  <v3:Item>
                                    <v3:CarID>2</v3:CarID>
                                  </v3:Item>
                                </List>
                              </v1:Resp>'
                             )
                     ,'Level_1:Resp/Level_2:List/Level_3:Item/Level_3:CarID'
                     ,'xmlns:Level_1="http://testserver/v1"
                       xmlns:Level_2="http://testserver/v2"
                       xmlns:Level_3="http://testserver/v3"'
            )
        )
    ) x;

CAR_ID
--------------------------------------------------------------------------------
 1 
 2 

SQL> 

PS. Хотел бы заодно акцентировать на том, что для меня, в свое время, оказавшись не очевидным, крайне больно стукнуло по голове:
Extract возвращает XML-фрагмент. ExtractValue возвращает значение, со всеми вытекающими:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> 
select
  extractValue(value(t),'tag') extractValue
  ,t.Extract('tag/text()').getStringVal() Extract
from
  table(xmlSequence(XMLType('<tag>'||chr( 38 )||'lt;Hello'||chr( 38 )||'gt;</tag>'))) t;

EXTRACTVALUE                                                                     EXTRACT
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
<Hello>                                                                          & lt;Hello& gt;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34771478
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
В документации есть такая штука:
имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  <EMPLOYEES>
                     <EMP>
                        <EMPNO> 112 </EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                        <SALARY> 50000 </SALARY>
                      </EMP>
                     <EMP>
                        <EMPNO> 217 </EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SALARY> 60000 </SALARY>
                     </EMP>
                     <EMP> 
                        <EMPNO> 412 </EMPNO> 
                        <EMPNAME>Jack</EMPNAME>
                        <SALARY> 40000 </SALARY>
                     </EMP>
                    </EMPLOYEES>
с помощью
Код: plaintext
1.
2.
3.
SELECT SYS_XMLAGG(value(e), xmlformat('EMPLOYEES'))
   into xml_res
   FROM TABLE(XMLSequence(Extract(xml_str, '/EMPLOYEES/EMP'))) e
   WHERE EXTRACTVALUE(value(e), '/EMP/SALARY') >=  50000 
выбираются те блоки EMP, в которых salary >=5000

А как аналогичным способом обновить данные? Например, установить <SALARY>100000</SALARY> для тех, где salary >= 5000 ????
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34771611
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALDВ документации есть такая штука:
имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  <EMPLOYEES>
                     <EMP>
                        <EMPNO> 112 </EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                        <SALARY> 50000 </SALARY>
                      </EMP>
                     <EMP>
                        <EMPNO> 217 </EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SALARY> 60000 </SALARY>
                     </EMP>
                     <EMP> 
                        <EMPNO> 412 </EMPNO> 
                        <EMPNAME>Jack</EMPNAME>
                        <SALARY> 40000 </SALARY>
                     </EMP>
                    </EMPLOYEES>
с помощью
Код: plaintext
1.
2.
3.
SELECT SYS_XMLAGG(value(e), xmlformat('EMPLOYEES'))
   into xml_res
   FROM TABLE(XMLSequence(Extract(xml_str, '/EMPLOYEES/EMP'))) e
   WHERE EXTRACTVALUE(value(e), '/EMP/SALARY') >=  50000 
выбираются те блоки EMP, в которых salary >=5000

А как аналогичным способом обновить данные? Например, установить <SALARY>100000</SALARY> для тех, где salary >= 5000 ????

Аналогичным имхо никак. Но если Вам не страшны альтернативные пути, то вот так можно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> WITH t AS (
   2   SELECT XMLTYPE('<EMPLOYEES>
  3   <EMP>
  4      <EMPNO>112</EMPNO>
  5      <EMPNAME>Joe</EMPNAME>
  6      <SALARY>50000</SALARY>
  7    </EMP>
  8   <EMP>
  9      <EMPNO>217</EMPNO>
 10      <EMPNAME>Jane</EMPNAME>
 11      <SALARY>60000</SALARY>
 12   </EMP>
 13   <EMP>
 14      <EMPNO>412</EMPNO>
 15      <EMPNAME>Jack</EMPNAME>
 16      <SALARY>40000</SALARY>
 17   </EMP>
 18  </EMPLOYEES>') x
  19   FROM dual)
  20   SELECT x,updatexml(x,'//SALARY[text()>50000]/text()', 100000 ).extract('/') y
  21   FROM t
  22   /

X                                        Y
---------------------------------------- ----------------------------------------
<EMPLOYEES>                              <EMPLOYEES>
 <EMP>                                     <EMP>
    <EMPNO> 112 </EMPNO>                       <EMPNO> 112 </EMPNO>
    <EMPNAME>Joe</EMPNAME>                   <EMPNAME>Joe</EMPNAME>
    <SALARY> 50000 </SALARY>                   <SALARY> 50000 </SALARY>
  </EMP>                                   </EMP>
 <EMP>                                     <EMP>
    <EMPNO> 217 </EMPNO>                       <EMPNO> 217 </EMPNO>
    <EMPNAME>Jane</EMPNAME>                  <EMPNAME>Jane</EMPNAME>
    <SALARY> 60000 </SALARY>                   <SALARY> 100000 </SALARY>
 </EMP>                                    </EMP>
 <EMP>                                     <EMP>
    <EMPNO> 412 </EMPNO>                       <EMPNO> 412 </EMPNO>
    <EMPNAME>Jack</EMPNAME>                  <EMPNAME>Jack</EMPNAME>
    <SALARY> 40000 </SALARY>                   <SALARY> 40000 </SALARY>
 </EMP>                                    </EMP>
</EMPLOYEES>                             </EMPLOYEES>

Best regards

Maxim
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34777546
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
Спасибо.

а подскажите пож-та еще такую штуку:

имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  xml_str := XMLType('<EMPLOYEES>
                     <EMP>
                        <EMPNO>112</EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                        <SALARY>50000</SALARY>
                      </EMP>
                     <EMP>
                        <EMPNO>217</EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SAL>
                             <SALARY>60000</SALARY>
                        </SAL>
                     </EMP>
                    </EMPLOYEES>');
когда пишу
Код: plaintext
1.
str_id := xml_str.extract('//SALARY/text()').getStringVal();
  dbms_output.put_line(str_id);
получаю просто 50006000.
хочется распарсить нормально, по-одному числу, но
Код: plaintext
1.
2.
3.
4.
5.
6.
	  select d.extract('/').getStringVal() as "temp_table"
		bulk collect into cur_clob
		from table(XMLSequence(xml_str.extract('//SALARY'))) d;
        
    for i in cur_clob.first..cur_clob.count loop
        dbms_output.put_line(cur_clob(i).cl);
    end loop;
дает
<SALARY>50000</SALARY>
<SALARY>60000</SALARY>
а не
50000
60000
Когда применяю .../text() - ругается.
Как получить значения внутри <SALARY>?
(в будущем хочется таким образом выдирать ID и по ним получать еще некий блок xml-я. сразу все что надо в реальной задаче, в одном запросе выводить не получается)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34777624
jenyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALDКак получить значения внутри <SALARY>?

EXTRACTVALUE(d.column_value, '/SALARY')
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34796334
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
имею
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  xml_str := XMLType('<EMPLOYEES>
                     <EMP>
                        <EMPNO>112</EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                        <SALARY>50000</SALARY>
                      </EMP>
                     <EMP>
                        <EMPNO>217</EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SAL>
                             <SALARY>60000</SALARY>
                        </SAL>
                     </EMP>
                    </EMPLOYEES>');
как получить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  xml_str := XMLType('<EMPLOYEES>
                     <EMP>
                        <EMPNO>112</EMPNO> 
                        <EMPNAME>Joe</EMPNAME>
                      </EMP>
                     <EMP>
                        <EMPNO>217</EMPNO>
                        <EMPNAME>Jane</EMPNAME> 
                        <SAL/>
                     </EMP>
                    </EMPLOYEES>');
т.е. вообще убрать теги <SALARY></SALARY>???
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34796556
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
SQL> with t as (
   2   select XMLType('<EMPLOYEES>
  3                       <EMP>
  4                          <EMPNO>112</EMPNO>
  5                          <EMPNAME>Joe</EMPNAME>
  6                          <SALARY>50000</SALARY>
  7                        </EMP>
  8                       <EMP>
  9                          <EMPNO>217</EMPNO>
 10                          <EMPNAME>Jane</EMPNAME>
 11                          <SAL>
 12                               <SALARY>60000</SALARY>
 13                          </SAL>
 14                       </EMP>
 15                      </EMPLOYEES>') x
  16   from dual)
  17   select z.x.extract('/') x,
  18   deletexml(x,'//SALARY').extract('/') y
  19   FROM t z
  20   /

X                              Y
------------------------------ ------------------------------
<EMPLOYEES>                    <EMPLOYEES>
  <EMP>                          <EMP>
    <EMPNO> 112 </EMPNO>             <EMPNO> 112 </EMPNO>
    <EMPNAME>Joe</EMPNAME>         <EMPNAME>Joe</EMPNAME>
    <SALARY> 50000 </SALARY>       </EMP>
  </EMP>                         <EMP>
  <EMP>                            <EMPNO> 217 </EMPNO>
    <EMPNO> 217 </EMPNO>             <EMPNAME>Jane</EMPNAME>
    <EMPNAME>Jane</EMPNAME>        <SAL/>
    <SAL>                        </EMP>
      <SALARY> 60000 </SALARY>   </EMPLOYEES>
    </SAL>
  </EMP>
</EMPLOYEES>

Best regards

Maxim
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34796812
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
Maxim Demenko[src oracle]SQL> with t as (
2 select XMLType('<EMPLOYEES>
3 <EMP>
4 <EMPNO>112</EMPNO>
5 <EMPNAME>Joe</EMPNAME>
6 <SALARY>50000</SALARY>
7 </EMP>
8 <EMP>
9 <EMPNO>217</EMPNO>
10 <EMPNAME>Jane</EMPNAME>
11 <SAL>
12 <SALARY>60000</SALARY>
13 </SAL>
14 </EMP>
15 </EMPLOYEES>') x
16 from dual)
17 select z.x.extract('/') x,
18 deletexml(x,'//SALARY').extract('/') y
19 FROM t z
20 /

ORA-00904: "DELETEXML": недопустимый идентификатор
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34796936
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALDORA-00904: "DELETEXML": недопустимый идентификаторRTFM Oracle Database 10g Release 2 (10.2) New Features in Oracle XML DB (FAQ)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34797015
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
Elic ALDORA-00904: "DELETEXML": недопустимый идентификаторRTFM Oracle Database 10g Release 2 (10.2) New Features in Oracle XML DB (FAQ)
хорошо, а как в 9ке тогда сделать deleteXML?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34797270
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALD
хорошо, а как в 9ке тогда сделать deleteXML?

Попробуйте xslt, должно работать, нет 9ки под руками - не могу проверить.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SQL> WITH T AS (
   2   select xmltype('<?xml version="1.0"?>
  3  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4          <xsl:template match="*">
  5             <xsl:if test="self::*[name() !=''SALARY'']">
  6                  <xsl:copy>
  7                          <xsl:apply-templates/>
  8                  </xsl:copy>
  9                  </xsl:if>
 10          </xsl:template>
 11  </xsl:stylesheet>') xsl,
  12   xmltype('<EMPLOYEES>
 13   <EMP>
 14      <EMPNO>112</EMPNO>
 15      <EMPNAME>Joe</EMPNAME>
 16      <SALARY>50000</SALARY>
 17    </EMP>
 18   <EMP>
 19      <EMPNO>217</EMPNO>
 20      <EMPNAME>Jane</EMPNAME>
 21      <SAL>
 22           <SALARY>60000</SALARY>
 23      </SAL>
 24   </EMP>
 25  </EMPLOYEES>') xml
  26   from dual)
  27   select
  28   x.xml.extract('/') x,
  29   xmltransform(xml,xsl).extract('/') y
  30   from t x
  31   /

X                              Y
------------------------------ ------------------------------
<EMPLOYEES>                    <EMPLOYEES>
  <EMP>                          <EMP>
    <EMPNO> 112 </EMPNO>             <EMPNO> 112 </EMPNO>
    <EMPNAME>Joe</EMPNAME>         <EMPNAME>Joe</EMPNAME>
    <SALARY> 50000 </SALARY>       </EMP>
  </EMP>                         <EMP>
  <EMP>                            <EMPNO> 217 </EMPNO>
    <EMPNO> 217 </EMPNO>             <EMPNAME>Jane</EMPNAME>
    <EMPNAME>Jane</EMPNAME>        <SAL/>
    <SAL>                        </EMP>
      <SALARY> 60000 </SALARY>   </EMPLOYEES>
    </SAL>
  </EMP>
</EMPLOYEES>
Best regards

Maxim
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34901587
ALD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ALD
Гость
как подняться на уровень выше??

назовем первичным xml это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
<ROWSET>
           <ROW>
             <CL_ID> 117374317391 </CL_ID>
             <CL_REF> 117374317390 </CL_REF>
             <CL_Institution> 00040 </CL_Institution>
             <CL_Action_Type>ADD</CL_Action_Type>
             <CL_Object_Type>CLIENT</CL_Object_Type>
             <CL_ShortName>SC- 0004 </CL_ShortName>
             <CL_Number>000000I</CL_Number>
             <CL_First_Name>ATM SERVICE CARD</CL_First_Name>
             <CL_Last_Name> 0004 - 1 </CL_Last_Name>
             <CN_ID> 117374317396 </CN_ID>
             <CN_REF> 117374317392 </CN_REF>
             <CN_Institution> 00040 </CN_Institution>
             <CN_Acc_Number> 0004 -SC0001A</CN_Acc_Number>
             <CN_Acc_Scheme>DPER</CN_Acc_Scheme>
             <CN_Acc_Sub_Type> 000157 </CN_Acc_Sub_Type>
             <CN_Acc_Serv_Pack>PVCRB1</CN_Acc_Serv_Pack>
             <CN_Plastic_First>ATM SERVICE CARD</CN_Plastic_First>
             <CN_Plastic_Last> 0004 - 1 </CN_Plastic_Last>
             <C_Card>
               <ROWSET>
                 <ROW>
                   <C_ID> 117374317397 </C_ID>
                   <C_REF> 117374317387 </C_REF>
                   <C_Institution> 00040 </C_Institution>
                   <C_Date_Exp> 2007 - 11 - 04 </C_Date_Exp>
                 </ROW>
                 <ROW>
                   <C_ID> 117374317398 </C_ID>
                   <C_REF> 117374317388 </C_REF>
                   <C_Institution> 00040 </C_Institution>
                   <C_Date_Exp> 2007 - 11 - 05 </C_Date_Exp>
                 </ROW>
               </ROWSET>
             </C_Card>
           </ROW>
         </ROWSET>
далее шаблон для трансформа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
...      <ApplicationsList>
        <xsl:for-each select="/ROWSET/ROW">
        	<Application>
  				<ObjectType>ClientContract</ObjectType>
  				<ActionType>Add</ActionType>
  				<RegNumber>'||LPAD([COUNTERS].[SQ].GetNextCount('XML_ISS_APPL_NUM"7_contract_card"')||'</RegNumber>
  				<OrderDprt><xsl:value-of select="CL_Institution"/></OrderDprt>
  				...
  				<SubApplList>
  					<xsl:for-each select="C_Card/ROWSET/ROW">
  						<xsl:call-template name="7_contract_card"/>
  					</xsl:for-each>
  				</SubApplList>
            </Application>
        </xsl:for-each>
      </ApplicationsList>

	<xsl:template name="7_contract_card">
		<Application>
			<ObjectType>Contract</ObjectType>
			<ActionType>Add</ActionType>
			<RegNumber>'||LPAD([COUNTERS].[SQ].GetNextCount('XML_ISS_APPL_NUM', NULL),8,'0')||'</RegNumber>
			<OrderDprt><xsl:value-of select="???/CN_Institution"/></OrderDprt>
			<Data>
				<Contract>
					<PlasticInfo>
						<FirstName><xsl:value-of select="???/CN_Plastic_First"/></FirstName>
						<LastName><xsl:value-of select="???/CN_Plastic_Last"/></LastName>
						<CompanyName><xsl:value-of select="???/CN_Plastic_Company"/></CompanyName>
					</PlasticInfo>
				</Contract>
			</Data>
			<SubApplList>
				<xsl:call-template name="8_card"/>
			</SubApplList>
		</Application>
	</xsl:template>

т.е. в <xsl:template name="7_contract_card"> мне CN_Plastic_First и др. надо вытащить с уровня выше в первичном xml. что надо поставить вместо вопросиков???? уже и // и .. пробовали - не помогает.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34901641
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALDт.е. в <xsl:template name="7_contract_card"> мне CN_Plastic_First и др. надо вытащить с уровня выше в первичном xml. что надо поставить вместо вопросиков???? уже и // и .. пробовали - не помогает.
как вы думаете в контексте <xsl:for-each select="C_Card/ROWSET/ROW"> каким по счету родителем будет ROW содержащий CN_Plastic_First ?
Код: plaintext
<xsl:value-of select="../../../CN_Plastic_First"/>
если я правильно посчитал теги ;)
ЗЫ отдельный топик лениво было сделать ?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35146781
XML_queries
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с одной проблемой. Есть таблица:

Код: plaintext
1.
2.
3.
4.
5.
create table test_query_with_xml_field (
     id  number( 10 ) not null primary key
    ,result  char( 1 ) not null -- 'S' successful, 'U' unsuccessful
    ,details xmltype
);

и данные в ней:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
insert into test_query_with_xml_field values (
      1 
    ,'U'
    ,xmltype(
'<Details>
  <Events>
    <Event type="failure" code="111">No file found</Event>
    <Event type="failure" code="222">Access denied</Event>
  </Events>
  <AdditionalInfo>
    <Called>MYPACK.MYPROC</Called>
    <UserID>User777</UserID>
  </AdditionalInfo>
</Details>'
    )
);

Не могу понять, каким образом можно составить запрос, который бы вернул данные, где Result = 'U' в таком обьёме:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ID
Result
Called
UserID
EventCode
EventMessage

 1  | U | MYPACK.MYPROC | User777 |  111  | No file found
 1  | U | MYPACK.MYPROC | User777 |  222  | Access denied

Подскажите, пожалуйста, как это можно было бы сделать.

Можно вариант №2 (но лучше было бы первый):


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ID
Result
Called
UserID
EventInformation

 1  | U | MYPACK.MYPROC | User777 |  111  - No file found;  222  - Access denied


Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35146792
XML_queries
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
XML_queriesи данные в ней:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
insert into test_query_with_xml_field values (
      1 
    ,'U'
    ,xmltype(
'<Details>
  <Events>
    <Event type="failure" code="111">No file found</Event>
    <Event type="failure" code="222">Access denied</Event>
  </Events>
  <AdditionalInfo>
    <Called>MYPACK.MYPROC</Called>
    <UserID>User777</UserID>
  </AdditionalInfo>
</Details>'
    )
);



Правильнее будет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
insert into test_query_with_xml_field values (
      1 
    ,'U'
    ,xmltype(
'<?xml version="1.0" encoding="utf-8" ?>
<Details>
  <Events>
    <Event type="failure" code="111">No file found</Event>
    <Event type="failure" code="222">Access denied</Event>
  </Events>
  <AdditionalInfo>
    <Called>MYPACK.MYPROC</Called>
    <UserID>User777</UserID>
  </AdditionalInfo>
</Details>'
    )
);

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35146935
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> select ID
   2         ,Result
   3         ,extractValue(t.details,'Details/AdditionalInfo/Called') Called
   4         ,extractValue(t.details,'Details/AdditionalInfo/UserID') UserID
   5         ,extractValue(value(d),'Event/@code') EventCode
   6         ,extractValue(value(d),'Event') EventMessage
   7   from test_query_with_xml_field t
   8        ,table(xmlSequence(Extract(t.details,'/Details/Events/Event '))) d
   9   where Result = 'U'
  10   ;
 
         ID RESULT CALLED           USERID     EVENTCODE   EVENTMESSAGE
----------- ------ ---------------- ---------- ----------- --------------
           1  U      MYPACK.MYPROC    User777     111          No file found
           1  U      MYPACK.MYPROC    User777     222          Access denied
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35147192
XML_queries
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромнейшее спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203228
AnastasiaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пож-та, как можно удалить все пустые теги?
т.е если после Transform получили
<ROW>
<TEG1>111</TEG1>
<TEG2></TEG2>
<TEG3>333</TEG3>
</ROW>
то надо удалить TEG2

Oracle 9ка.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203256
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnastasiaD wrote:

> Подскажите пож-та, как можно удалить все пустые теги?
> т.е если после Transform получили
> <ROW>
> <TEG1>111</TEG1>
> <TEG2></TEG2>
> <TEG3>333</TEG3>
> </ROW>
> то надо удалить TEG2
>
> Oracle 9ка.

Набор тегов постоянен или заранее неизвестен?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203297
AnastasiaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov
AnastasiaD wrote:

> Подскажите пож-та, как можно удалить все пустые теги?
> т.е если после Transform получили
> <ROW>
> <TEG1>111</TEG1>
> <TEG2></TEG2>
> <TEG3>333</TEG3>
> </ROW>
> то надо удалить TEG2
>
> Oracle 9ка.

Набор тегов постоянен или заранее неизвестен?
Posted via ActualForum NNTP Server 1.4
Множество тегов не известно и они еще могут быть вложенными т.е.
<ROW>
<TEG1>111</TEG1>
<TEG2></TEG2>
<TEG3>
<teg4></teg4>
</TEG3>
</ROW>
и тогда надо удалить teg2,3,4
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203343
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select XmlType (
'<ROW>
  <TEG1>111</TEG1>
  <TEG2></TEG2>
  <TEG3>
    <TEG4></TEG4>
  </TEG3>
</ROW>'
       ).transform (
         XmlType (
'<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:call-template name="rec"/>
    </xsl:element>
  </xsl:template>
  <xsl:template name="rec">
     <xsl:for-each select="child::node()[text()!=false()]">
        <xsl:copy>
          <xsl:value-of select="text()"/>
          <xsl:call-template name="rec"/>
        </xsl:copy>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>'
         )
       ).getClobVal() no_empty_element
from DUAL;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203399
AnastasiaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select XmlType (
'<ROW>
  <TEG1>111</TEG1>
  <TEG2></TEG2>
  <TEG3>
    <TEG4></TEG4>
  </TEG3>
</ROW>'
       ).transform (
         XmlType (
'<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:call-template name="rec"/>
    </xsl:element>
  </xsl:template>
  <xsl:template name="rec">
     <xsl:for-each select="child::node()[text()!=false()]">
        <xsl:copy>
          <xsl:value-of select="text()"/>
          <xsl:call-template name="rec"/>
        </xsl:copy>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>'
         )
       ).getClobVal() no_empty_element
from DUAL;


Спасибо! щас попробую прикрутить...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203465
AnastasiaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select XmlType (
'<ROW>
  <TEG1>111</TEG1>
  <TEG2></TEG2>
  <TEG3>
    <TEG4></TEG4>
  </TEG3>
</ROW>'
       ).transform (
         XmlType (
'<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:call-template name="rec"/>
    </xsl:element>
  </xsl:template>
  <xsl:template name="rec">
     <xsl:for-each select="child::node()[text()!=false()]">
        <xsl:copy>
          <xsl:value-of select="text()"/>
          <xsl:call-template name="rec"/>
        </xsl:copy>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>'
         )
       ).getClobVal() no_empty_element
from DUAL;

не работет на
<ApplicationFile>
<ttt>
<ggg>234</ggg>
</ttt>
<ttt>111</ttt>
</ApplicationFile>

получаю только
<ApplicationFile>
<ttt>111</ttt>
</ApplicationFile>
а должно быть с <ggg>
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203537
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnastasiaD
не работет на
<ApplicationFile>
<ttt>
<ggg>234</ggg>
</ttt>
<ttt>111</ttt>
</ApplicationFile>

получаю только
<ApplicationFile>
<ttt>111</ttt>
</ApplicationFile>
а должно быть с <ggg>

Тогда имхо надо работать в 2 прохода: для каждого элемента сперва определять, нет ли у него детей с непустым значением и если есть, то печатать и переходить к детям.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203662
AnastasiaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov

Тогда имхо надо работать в 2 прохода: для каждого элемента сперва определять, нет ли у него детей с непустым значением и если есть, то печатать и переходить к детям.
вложенность детей нам тоже не известна.. может же быть
<teg1>
...
<tegN>
<end>а тут или есть или нет значения</end>
</tegN>
...
</teg1>

чтото я пока туго в xsl-е соображаю..
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35203680
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnastasiaD wrote:

> вложенность детей нам тоже не известна.. может же быть

рекурсией.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35204187
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
оно?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> select XmlType (
   2   '<ApplicationFile>
  3  <ttt>
  4  <ggg>234</ggg>
  5  <no_text><no_text></no_text></no_text>
  6  </ttt>
  7  <no_text></no_text>
  8  <ttt>111</ttt>
  9  </ApplicationFile>
 10  '
  11          ).transform (
  12            XmlType (
  13   '<?xml version="1.0"?>
 14  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 15    <xsl:template match="*">
 16      <xsl:element name="{local-name()}">
 17        <xsl:call-template name="rec"/>
 18      </xsl:element>
 19    </xsl:template>
 20    <xsl:template name="rec">
 21       <xsl:for-each select="child::node()">
 22          <xsl:if test=".//text()">
 23            <xsl:copy>
 24              <xsl:value-of select="text()"/>
 25              <xsl:call-template name="rec"/>
 26            </xsl:copy>
 27          </xsl:if>
 28       </xsl:for-each>
 29    </xsl:template>
 30  </xsl:stylesheet>'
  31            )
  32          ).getStringVal() no_empty_element
  33   from DUAL;
 
NO_EMPTY_ELEMENT
--------------------------------------------------------------------------------
<ApplicationFile>
  <ttt>
    <ggg> 234 </ggg>
  </ttt>
  <ttt> 111 </ttt>
</ApplicationFile>
 
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35208698
AnastasiaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zloxaоно?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> select XmlType (
   2   '<ApplicationFile>
  3  <ttt>
  4  <ggg>234</ggg>
  5  <no_text><no_text></no_text></no_text>
  6  </ttt>
  7  <no_text></no_text>
  8  <ttt>111</ttt>
  9  </ApplicationFile>
 10  '
  11          ).transform (
  12            XmlType (
  13   '<?xml version="1.0"?>
 14  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 15    <xsl:template match="*">
 16      <xsl:element name="{local-name()}">
 17        <xsl:call-template name="rec"/>
 18      </xsl:element>
 19    </xsl:template>
 20    <xsl:template name="rec">
 21       <xsl:for-each select="child::node()">
 22          <xsl:if test=".//text()">
 23            <xsl:copy>
 24              <xsl:value-of select="text()"/>
 25              <xsl:call-template name="rec"/>
 26            </xsl:copy>
 27          </xsl:if>
 28       </xsl:for-each>
 29    </xsl:template>
 30  </xsl:stylesheet>'
  31            )
  32          ).getStringVal() no_empty_element
  33   from DUAL;
 
NO_EMPTY_ELEMENT
--------------------------------------------------------------------------------
<ApplicationFile>
  <ttt>
    <ggg> 234 </ggg>
  </ttt>
  <ttt> 111 </ttt>
</ApplicationFile>
 


Огромное спасибо! так вроде работает.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35318748
avp78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день!
может кто поможет разобраться как выбрать значение DateFrom из ниже приведённой XML-ки в табличном виде?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
    xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
    xmlns:rs="urn:schemas-microsoft-com:rowset"
    xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly">
        <s:AttributeType name="DateFrom" rs:number="1" rs:nullable="true" rs:writeunknown="true">
            <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true"/>
        </s:AttributeType>
        <s:AttributeType name="DateTo" rs:number="2" rs:nullable="true" rs:writeunknown="true">
            <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true"/>
        </s:AttributeType>
        <s:extends type="rs:rowbase"/>
    </s:ElementType>
</s:Schema>
<rs:data>
    <z:row DateFrom="2007-08-01T00:00:00" DateTo="2007-08-31T00:00:00"/>
    <z:row DateFrom="2007-09-01T00:00:00" DateTo="2007-09-10T00:00:00"/>
</rs:data>
</xml>

по аналогии с таким запросом не получается :(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select extract(value(d),'//@DateFrom').getStringVal() a
from table(XMLSequence(XMLType( 
'<xml>
<data>
    <row DateFrom="2007-08-01T00:00:00" DateTo="2007-08-31T00:00:00"/>
    <row DateFrom="2007-09-01T00:00:00" DateTo="2007-09-10T00:00:00"/>
</data>
</xml>').extract('xml/data/row'))) d;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35325352
avp78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините что опять поднимаю вопрос, но может кто нить поможет?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35325531
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> select ExtractValue(value(t),'z:row@DateFrom','xmlns:z="#RowsetSchema"')
   2   from
   3      Table(XmlSequence(Extract(XMLtype(
   4   '<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
  5      xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
  6      xmlns:rs="urn:schemas-microsoft-com:rowset"
  7      xmlns:z="#RowsetSchema">
  8  <s:Schema id="RowsetSchema">
  9      <s:ElementType name="row" content="eltOnly">
 10          <s:AttributeType name="DateFrom" rs:number="1" rs:nullable="true" rs:writeunknown="true">
 11              <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true"/>
 12          </s:AttributeType>
 13          <s:AttributeType name="DateTo" rs:number="2" rs:nullable="true" rs:writeunknown="true">
 14              <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true"/>
 15          </s:AttributeType>
 16          <s:extends type="rs:rowbase"/>
 17      </s:ElementType>
 18  </s:Schema>
 19  <rs:data>
 20      <z:row DateFrom="2007-08-01T00:00:00" DateTo="2007-08-31T00:00:00"/>
 21      <z:row DateFrom="2007-09-01T00:00:00" DateTo="2007-09-10T00:00:00"/>
 22  </rs:data>
 23  </xml>'),'xml/rs:data/z:row','xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"')))t
  24   ;
 
EXTRACTVALUE(VALUE(T),'Z:ROW@D
--------------------------------------------------------------------------------
 2007 - 08 -01T00: 00 : 00 
 2007 - 09 -01T00: 00 : 00 
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35325626
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with t as (
select xmltype(
'<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
    xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
    xmlns:rs="urn:schemas-microsoft-com:rowset"
    xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly">
        <s:AttributeType name="DateFrom" rs:number="1" rs:nullable="true" rs:writeunknown="true">
            <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true"/>
        </s:AttributeType>
        <s:AttributeType name="DateTo" rs:number="2" rs:nullable="true" rs:writeunknown="true">
            <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true"/>
        </s:AttributeType>
        <s:extends type="rs:rowbase"/>
    </s:ElementType>
</s:Schema>
<rs:data>
    <z:row DateFrom="2007-08-01T00:00:00" DateTo="2007-08-31T00:00:00"/>
    <z:row DateFrom="2007-09-01T00:00:00" DateTo="2007-09-10T00:00:00"/>
</rs:data>
</xml>') x from dual)

select extract(column_value, '//@DateFrom').getstringval() d from t,
  table(xmlsequence(extract(x,'//row', 'xmlns="#RowsetSchema"')))
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35325654
avp78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем!!! отлично работают оба варианта!! :)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35443131
help_xml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, плиз, что не так делаю.
Надо вывести в одну строчку все значения показателей.
Выводит пустые значения:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 
  v.xv.Extract('//KPI_by_day//KPI[name="KPI1"]/@value').getStringVal() kpi1,
  v.xv.Extract('//KPI_by_day//KPI[name="KPI2"]/@value').getStringVal() kpi2,
  v.xv.Extract('//KPI_by_day//KPI[name="KPI3"]/@value').getStringVal() kpi3
from 
(
    select 
    xmltype(
            '<?xml version="1.0" encoding="windows-1251" ?>
            <KPI_by_day>
            <KPI name="KPI1" value="100.56" />
            <KPI name="KPI2" value="10.4" />
            <KPI name="KPI3" value="3" />
            </KPI_by_day>'
            )  xv
from dual
) v;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35443138
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
help_xml wrote:

> Подскажите, плиз, что не так делаю.


Условие "KPI[name" везде заменить на "KPI[@name".
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35443142
help_xml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov
help_xml wrote:

> Подскажите, плиз, что не так делаю.


Условие "KPI[name" везде заменить на "KPI[@name".
Posted via ActualForum NNTP Server 1.4

Спасибо!, работает :)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35649770
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получают от soap ответ от сбербанка
пока стоит задача научится его екстрактить на части, но этот подлец тут же ругается, на первом же элементе - extract('soap:Envelope').

оракулORA-31011: XML parsing failed ORA-19202: Error occurred in XML processing LPX-00601: Invalid token in: 'soap:Envelope' ORA-06512: at "SYS.XMLTYPE", line 111

без extract преобразование к xmltype проходит. Что ему еще от меня нужно ???

сокращенный xml

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
select *
from table(XMLSequence(xmltype(
'<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      
      <soap:Body>
          <GetCursOnDateResponse xmlns="http://web.cbr.ru/">
              <GetCursOnDateResult>
                 <xs:schema id="ValuteData" xmlns="" 
                     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                     xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
                     xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
                       
                        <xs:element name="ValuteData" msdata:IsDataSet="true" 
                            msdata:UseCurrentLocale="true" msprop:OnDate="20071230">
                            
                             <xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="ValuteCursOnDate">
                                   <xs:complexType>
                                      <xs:sequence>
                                         <xs:element name="Vname" type="xs:string" minOccurs="0" />
                                         <xs:element name="Vnom" type="xs:decimal" minOccurs="0" />
                                         <xs:element name="Vcurs" type="xs:decimal" minOccurs="0" />
                                         <xs:element name="Vcode" type="xs:int" minOccurs="0" />
                                         <xs:element name="VchCode" type="xs:string" minOccurs="0" />
                                      </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                                </xs:choice>
                             </xs:complexType>
                         </xs:element>
                  </xs:schema>
                  
                  
                   <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
                           xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                  
                           <ValuteData xmlns="">
                              <ValuteCursOnDate diffgr:id="ValuteCursOnDate1" msdata:rowOrder="0">
                                 <Vname>Австралийский доллар</Vname>
                                 <Vnom>1</Vnom>
                                 <Vcurs>21.5246</Vcurs>
                                 <Vcode>36</Vcode>
                                 <VchCode>AUD</VchCode>
                              </ValuteCursOnDate>
                              
                              <ValuteCursOnDate diffgr:id="ValuteCursOnDate2" msdata:rowOrder="1">
                                 <Vname>Фунт стерлингов Соединенного королевства</Vname>
                                 <Vnom>1</Vnom>
                                 <Vcurs>49.0114</Vcurs>
                                 <Vcode>826</Vcode>
                                 <VchCode>GBP</VchCode>
                               </ValuteCursOnDate>
                           </ValuteData>
                              
                   </diffgr:diffgram>
              </GetCursOnDateResult>
          </GetCursOnDateResponse>
     </soap:Body>
 </soap:Envelope>'
 ).extract('soap:Envelope')))
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35649820
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasЧто ему еще от меня нужно ???namespace
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select *
from table(XMLSequence(xmltype(
'<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Body>...
     </soap:Body>
 </soap:Envelope>'
 ).extract('//Body', 'xmlns="http://www.w3.org/2003/05/soap-envelope"')))
;

COLUMN_VALUE
--------------------------------------------------------------------
<soap:Body xmlns:soap="http://www.w3.org/2003/05/soap-envelope">...
     </soap:Body>
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35650010
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

супер, спасибо
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35650505
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут Timm давал ссылку на SQL/XML how-to для 10g.
Погонял те же тесты на 11g - SQL/XML стал в несколько раз быстрее и обгоняет DBMS_GEN.
В 11g теперь стоит Java 1.5 с JIT компилятором. Неужели настолько лучше стало, или просто SQL/XML на С переписали?
Завтра, если не забуду, надо трейсы снять. Если это Java так ускорилась, то есть повод и другие пакеты потестировать.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35651048
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как достать значение атрибута OnDate из
примера

я у него другой нейспейс
пробую так


Код: plaintext
1.
2.
3.
4.
5.
select extractValue(COLUMN_VALUE,'/@OnDate', 'xmlns="urn:schemas-microsoft-com:xml-msprop"') CUR_DATE
from table(XMLSequence(xmltype( 
testSoapclob(sysdate)
 ).extract('//element[@name="ValuteData"]','xmlns="http://www.w3.org/2001/XMLSchema"')
 ))
результат null
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35651289
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для простоты восприятия
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select extractValue(COLUMN_VALUE,'/@OnDate', 'xmlns="urn:schemas-microsoft-com:xml-msprop"') CUR_DATE
 from 
table(XMLSequence(xmltype( 
  '<xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" 
               name="ValuteData" 
               xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
               msdata:IsDataSet="true" 
               msdata:UseCurrentLocale="true" 
               xmlns:msprop="urn:schemas-microsoft-com:xml-msprop" 
               msprop:OnDate="20081031">
     <xs:complexType>
       <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:element name="ValuteCursOnDate">
           <xs:complexType>
             <xs:sequence>
               <xs:element name="Vname" type="xs:string" minOccurs="0"/>
               <xs:element name="Vnom" type="xs:decimal" minOccurs="0"/>
               <xs:element name="Vcurs" type="xs:decimal" minOccurs="0"/>
               <xs:element name="Vcode" type="xs:int" minOccurs="0"/>
               <xs:element name="VchCode" type="xs:string" minOccurs="0"/>
             </xs:sequence>
           </xs:complexType>
         </xs:element>
       </xs:choice>
     </xs:complexType>
   </xs:element>'
).extract('//element[@name="ValuteData"]','xmlns="http://www.w3.org/2001/XMLSchema"')
 ))   
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35651568
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
 extractValue(COLUMN_VALUE,'element/@x:OnDate', 'xmlns="http://www.w3.org/2001/XMLSchema" xmlns:x="urn:schemas-microsoft-com:xml-msprop"') CUR_DAT
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35651617
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zloxa
Код: plaintext
1.
 extractValue(COLUMN_VALUE,'element/@x:OnDate', 'xmlns="http://www.w3.org/2001/XMLSchema" xmlns:x="urn:schemas-microsoft-com:xml-msprop"') CUR_DAT
Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35760474
BinaryBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь распарсить XML документ:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--select value(t) as XMLBody
select extract(value(t), 'ListNar/nz/text()', 'xmlns="http://tempuri.org"').getStringVal()   OrderNumber
from table(XMLSequence(xmltype(
 '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xmlns:s="http://www.w3.org/2001/XMLSchema">
      <SOAP-ENV:Body>
          <ListNarResponse xmlns="http://tempuri.org">
               <ListNarResult xsi:type="s01:ListNarResult" xmlns:s01="http://tempuri.org">
                   <list>                      
                        <ListNar xsi:type="s02:ListNar" xmlns:s02="http://tempuri.org">
                          <nz xsi:type="s:long">101</nz>
                          <abon xsi:type="s:string">РЫЖИХ ИВАН ЕРЕМЕЕВИЧ</abon>
                          <ndog xsi:type="s:string">2009101</ndog>
                          <tl xsi:type="s:string">8124444101</tl>
                          <prim xsi:type="s:string">ЧЕРЕЗ ТУЭС 13.01</prim>
                        </ListNar>
                  </list>
              </ListNarResult>  
          </ListNarResponse>
      </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>').extract('//ListNarResponse/ListNarResult/list/ListNar', 'xmlns="http://tempuri.org"'))) t;

Oracle ругается:

ORA-31011: сбой разбора XML
ORA-19202: Возникла ошибка при обработке XML
LPX-00234: namespace prefix "xsi" is not declared
Error at line 1


Как правильно передать в это выражение нужный namespace?
extract(value(t), 'ListNar/nz/text()', 'xmlns="http://tempuri.org"').getStringVal()
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35760841
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BinaryBoyLPX-00234: namespace prefix "xsi" is not declared
Как правильно передать в это выражение нужный namespace? Всё правильно. Но На 9-ке не работает, потому что где-то теряются namespace-ы
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35760897
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elicгде-то
ТУТ

Код: plaintext
Connected to Oracle9i Enterprise Edition Release  9 . 2 . 0 . 8 . 0  \n \nSQL> \nSQL> select extract(value(t), \'ListNar/nz/text()\', \'xmlns="http://tempuri.org"\').getStringVal()   OrderNumber\n   2   from table(XMLSequence(extract(xmltype(\n   3    \'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"\n  4                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n  5                       xmlns:s="http://www.w3.org/2001/XMLSchema">\n  6        <SOAP-ENV:Body>\n  7            <ListNarResponse xmlns="http://tempuri.org">\n  8                 <ListNarResult xsi:type="s01:ListNarResult" xmlns:s01="http://tempuri.org">\n  9                     <list>\n 10                          <ListNar xsi:type="s02:ListNar" xmlns:s02="http://tempuri.org">\n 11                            <nz xsi:type="s:long">101</nz>\n 12                            <abon xsi:type="s:string">РЫЖИХ ИВАН ЕРЕМЕЕВИЧ</abon>\n 13                            <ndog xsi:type="s:string">2009101</ndog>\n 14                            <tl xsi:type="s:string">8124444101</tl>\n 15                            <prim xsi:type="s:string">ЧЕРЕЗ ТУЭС 13.01</prim>\n 16                          </ListNar>\n 17                    </list>\n 18                </ListNarResult>\n 19            </ListNarResponse>\n 20        </SOAP-ENV:Body>\n 21    </SOAP-ENV:Envelope>\'),\'//ListNarResponse/ListNarResult/list/ListNar\', \'xmlns="http://tempuri.org"\'))) t;\n \nORDERNUMBER\n--------------------------------------------------------------------------------\n 101 \n 
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35760911
BinaryBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicBinaryBoyLPX-00234: namespace prefix "xsi" is not declared
Как правильно передать в это выражение нужный namespace? Всё правильно. Но На 9-ке не работает, потому что где-то теряются namespace-ы

У меня 9.2.0.7
Вообще никак эту ситуацию не обойти?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35761361
BinaryBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic - спасибо!

Zloxa - мегареспект! Действительно, не очевидня фича!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35843186
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Заранее извиняюсь что вклиниваюсь со своими проблемами... Но думаю что не стоит отдельную тему заводить.

Имеется следующая задача: Принять с клиента XML следующей структуры (схема может быть изменена, если это поможет делу, т.к. генерация XML под нашим контролем). Грубо говоря, это некоторые "измерения" и соответствующие каждому измерению "значения параметров".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<Root>
 <M w="12345" t="2008.12.27 23:59:00">
  <V v="8513" p="1"/>
  <V v="5548" p="2"/>
  <V v="9087" p="3"/>
 </M>
 <M w="12345" t="2008.12.27 23:59:01">
  <V v="7686" p="1"/>
  <V v="5577" p="2"/>
 </M>
</Root>

И соответсвенно раскидать по 2 табличкам master-detail
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
CREATE TABLE m
(
 ID NUMBER( 20 ) NOT NULL,
 w  NUMBER( 20 ) NOT NULL,
 t  DATE       NOT NULL
);

ALTER TABLE m
 ADD CONSTRAINT xpkm
  PRIMARY KEY (ID);

ALTER TABLE m
 ADD CONSTRAINT xak1m
  UNIQUE (w, t);

CREATE SEQUENCE seq_m;

CREATE OR REPLACE TRIGGER tbi_m
   BEFORE INSERT
   ON m
   FOR EACH ROW
BEGIN
   IF :NEW.ID IS NULL
   THEN
      SELECT seq_m.NEXTVAL
        INTO :NEW.ID
        FROM DUAL;
   END IF;
END;
/

CREATE TABLE v
(
  m_id NUMBER( 20 ) NOT NULL,
  p    NUMBER( 20 ) NOT NULL,
  v    NUMBER( 10 ) NOT NULL
);

ALTER TABLE v
 ADD CONSTRAINT xpkv
  PRIMARY KEY (m_id, p);

ALTER TABLE v
 ADD CONSTRAINT r1v
  FOREIGN KEY (m_id) REFERENCES m (ID)
    ON DELETE CASCADE;

Имеются достаточно жёсткие требования по скорости работы, и объёму передаваемой информации. Передаваться будет ориентировочно 15 подобных XML пакетов в минуту (хотелось бы чтобы система работала в режиме 24/7), каждый пакет - это 60 измерений (т.е. на каждую секунду) и вплоть до 200 параметров на каждое измерение (итого 1 пакет это до 12000 новых записей, но "типично" надеюсь будет раза в 2-3 меньше). Допускаются повторные передачи (для простоты считаем что без удаления ранее принятых данных - т.е. используя MERGE).
Сейчас нарисована следующая ХП (по сути черновик, хотя и выполняет свои задачи) для приёма пакетов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
CREATE OR REPLACE PROCEDURE load_temporal_parameters (p_xml IN CLOB)
IS
   v_new_id   NUMBER ( 20 );
BEGIN
   FOR rec_m IN
      (SELECT m.EXTRACT ('/M/@w').getnumberval () w,
              TO_DATE (m.EXTRACT ('/M/@t').getstringval (),
                       'YYYY.MM.DD HH24:MI:SS'
                      ) t,
              m.EXTRACT ('/M') params
         FROM DUAL,
              TABLE (XMLSEQUENCE (XMLTYPE (p_xml).EXTRACT ('/Root/M'))) m)
   LOOP
      BEGIN
         SELECT ID
           INTO v_new_id
           FROM m
          WHERE w = rec_m.w AND t = rec_m.t;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            SELECT seq_m.NEXTVAL
              INTO v_new_id
              FROM DUAL;

            INSERT INTO m
                        (ID, w, t
                        )
                 VALUES (v_new_id, rec_m.w, rec_m.t
                        );
      END;

      FOR rec_v IN (SELECT v.EXTRACT ('/V/@p').getnumberval () p,
                           v.EXTRACT ('/V/@v').getnumberval () v
                      FROM DUAL,
                           TABLE (XMLSEQUENCE (rec_m.params.EXTRACT ('/M/V'))) v)
      LOOP
         MERGE INTO v
            USING (SELECT v_new_id m_id, rec_v.p p, rec_v.v v
                     FROM DUAL) nv
            ON (v.m_id = nv.m_id AND v.p = nv.p)
            WHEN MATCHED THEN
               UPDATE
                  SET v.v = nv.v
            WHEN NOT MATCHED THEN
               INSERT (m_id, p, v)
               VALUES (nv.m_id, nv.p, nv.v);
      END LOOP;
   END LOOP;
END;
/

К сожалению, по скорости работы это явно не лучшее решение. Пока пакеты небольшие, это ещё приемлемо, но вот обработка 100-200Кб-ного пакета занимает уже до 20 секунд :(

Хочется совета, как быть... Может быть переписать парсинг средствами dbms_xmldom? Даст ли это реальный выигрыш по скорости обработки? Или может быть можно как-то оптимизировать приведенный код? Избежать внутреннего цикла (я так понимаю, он для каждого "куска" повторно выполняет парсинг и строит новый DOM) - всё-же 60 "лишних" обращений на пакет... Но увы я не представляю как можно от этого уйти :(

Написать процедуру на Java (используя SAX) заманчиво, но скорее всего неосуществимо :(

Целевой сервер будет не ниже 10-го, но лучше всего, если решение будет совместимо с 9-м, т.к. девелоперский сервер будет 9i (9.2.0.8). Клиентом - пока будет VB6 прога (через старый добрый ADO - спасибо форуму, нашёл как побороть лимит передачи параметра в 32К ;) ), в перспективе может быть и C# (ADO.NET) и даже какое-то сугубо оракловское решение (HTTP).

WBR, Igor
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35843319
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov wrote at 27.02.2009 18:26:

> Имеется следующая задача: Принять с клиента XML следующей структуры
> (схема может быть изменена, если это поможет делу, т.к. генерация XML
> под нашим контролем).

....

> Имеются достаточно жёсткие требования по скорости работы, и объёму

....

> Целевой сервер будет не ниже 10-го, но лучше всего, если решение будет
> совместимо с 9-м, т.к. девелоперский сервер будет 9i (9.2.0.8).


Может сделать одну промежуточную таблицу и модифицировать XML так, чтобы он мог обработаться
пакетами DBMS_XMLSAVE и DBMS_XMLSTORE? Второй появился в Oracle 10g и по-моему через них будет
быстрее, чем через XmlType.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35844008
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут есть пара моментов
1) Оно до сих пор и работало через 2 промежуточные "рабочие" таблицы и пару процедур - там помимо погрузки ещё и вопросы обработки решались - минимаксы считались (по всему массиву конечно же считать минимакс это убийственно, вот оно и считалось по погружаемой порции, и сливалось с ранее запомненными данными), потом ещё и "интервалы непрерывности" считались (типа чтоб "дырки" по времени видеть - когда нет "измерений").
И всё это хозяйство, даже при не пиковой нагрузке генерировало до 45Мб редо-лога в минуту (чёрт его знает, там и сложность этой обработки, и кривость написанных процедур - всё понемногу влияло). Т.к. инстансы работали в режиме архивирования логов, то очень быстро пришлось такую систему вырубить :)
2) Я думал насчёт представления с инстед-оф триггером, чтоб он распихивал поступающие данные по 2-м таблицам. Это по идее сходно со схемой "плоской" рабочей таблицы...
Но, как я сейчас себе представляю логику работы такого триггера, то получается что для каждой записи (идущей в итоге в детэйл-таблицу) придётся делать поиск в мастер-таблице по альтернативному ключу (w+t) - а это боюсь будет очень неэффективно. Сейчас такой поиск проводится только 1 раз для всех "значений параметров" - которых, как я говорил, будет до 200 на "измерение"...
DBMS_XMLSAVE и тем паче DBMS_XMLSTORE конечно было бы заманчиво прикрутить (даже схему XML-я бы под них поменяли, чтобы не парится с трансформациями или "тонкой" настройкой пакета), но, как я понимаю, они оба не в состоянии работать с иерархиями :(

А в приведенной процедуре ничего нельзя подправить? Чтобы избежать для второго цикла запроса - т.е. как-то по иному rec_m.params прокручивать... Или тут не происходит повторного разбора XML-я?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35844792
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor KorolyovА в приведенной процедуре ничего нельзя подправить? Чтобы избежать для второго цикла запроса - т.е. как-то по иному rec_m.params прокручивать... Или тут не происходит повторного разбора XML-я?

Может тогда разбирать XML единожды до "плоского" вида и вставлять данные в обе таблицы, вроде такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
declare v_id M.id%type;
begin
  for i in (
    with x as (
      select '
    <Root>
     <M w="12345" t="2008.12.27 23:59:00">
      <V v="8513" p="1"/>
      <V v="5548" p="2"/>
      <V v="9087" p="3"/>
     </M>
     <M w="12345" t="2008.12.27 23:59:01">
      <V v="7686" p="1"/>
      <V v="5577" p="2"/>
     </M>
    </Root>' xml
      from DUAL
    )
    select xml.w xml_w
         , xml.t xml_t
         , xml.p xml_p
         , xml.v xml_v
         , v.v   v_v
    from (select extract(value(m), '/M/@w').getNumberVal() w
               , to_date(extract(value(m), '/M/@t').getStringVal(), 'yyyy.mm.dd hh24:mi:ss') t
               , extract(value(v), '/V/@p').getNumberVal() p
               , extract(value(v), '/V/@v').getNumberVal() v
          from x x
             , table (XmlSequence (XmlType (x.xml).extract('/Root/M'))) m
             , table (XmlSequence (extract(value(m), '/M/V'))) v
         ) xml
       , (select M.w
               , M.t
               , V.p
               , V.v
          from M
             , V
          where V.m_id = M.id
         ) v
    where  1 = 1 
      and v.w (+) = xml.w
      and v.t (+) = xml.t
      and v.p (+) = xml.p
  ) loop
    begin
      select M.id into v_id from M where M.w = i.xml_w and M.t = i.xml_t;
    exception when NO_DATA_FOUND then
      insert into M (id, w, t) values (SEQ_M.nextval, i.xml_w, i.xml_t)
      return id into v_id;
    end;

    if i.v_v is null then
      insert into V (m_id, p, v) values (v_id, i.xml_p, i.xml_v);
    elsif i.xml_v != i.v_v then
      update V set V.v = i.xml_v where V.m_id = v_id and V.p = i.xml_p;
    end if;
  end loop;
end;
/
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35844795
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Попробуйте разбор через xmldom, может добавит скорости:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
DECLARE
  l_doc      xmltype;
  l_nlist    DBMS_XMLDOM.DOMNodeList;  
  l_nlist_v  DBMS_XMLDOM.DOMNodeList; 
  l_node     DBMS_XMLDOM.DOMNode;          
  l_temp_n    DBMS_XMLDOM.DOMNode;    
  l_node_v     DBMS_XMLDOM.DOMNode;   
  l_nattrs DBMS_XMLDOM.DOMNamedNodeMap; 
  l_attr VARCHAR2( 2000 );              
  
 BEGIN
   
   l_doc := XMLType('<Root>
  <M w="12345" t="2008.12.27 23:59:00">
  <V v="8513" p="1">7</V>
  <V v="5548" p="2"/>
  <V v="9087" p="3"/>
 </M>
 <M w="12345" t="2008.12.27 23:59:01">
  <V v="7686" p="1"/>
  <V v="5577" p="2"/>
 </M>
 </Root>');  
              
--  for i in 0..1000 loop 
  l_nlist := DBMS_XMLDOM.getchildnodes(dbms_xmldom.getNodeFromFragment(l_doc.extract('//M')));

   FOR i IN  0 ..DBMS_XMLDOM.getLength(l_nlist)- 1  LOOP           
          l_node := DBMS_XMLDOM.item(l_nlist,i);            
			    l_nattrs := DBMS_XMLDOM.GetAttributes(l_node);         
          FOR i IN  0 ..DBMS_XMLDOM.GetLength(l_nattrs)- 1  LOOP
             l_temp_n    := DBMS_XMLDOM.item(l_nattrs,i);
             l_attr  := DBMS_XMLDOM.GetNodeValue(l_temp_n);
--             dbms_output.put_line(l_attr);									 
          END LOOP;         
        	 l_nlist_v := DBMS_XMLDOM.getchildnodes(l_node);
       
	FOR j IN  0 ..DBMS_XMLDOM.getLength(l_nlist_v)- 1  LOOP			    
             l_node_v := DBMS_XMLDOM.item(l_nlist_v,j);					
	l_nattrs := DBMS_XMLDOM.GetAttributes(l_node_v);         
             FOR i IN  0 ..DBMS_XMLDOM.GetLength(l_nattrs)- 1  LOOP
               l_temp_n   := DBMS_XMLDOM.item(l_nattrs,i);
               l_attr  := DBMS_XMLDOM.GetNodeValue(l_temp_n);
--               dbms_output.put_line(l_attr);									 
            END LOOP;  
      END LOOP;         
                   
   END LOOP;           
--end loop;	 
 
END; 
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #35847043
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, на текущий момент получилось следующее (на домашнем Oracle 10g XE при подаче тестового XML-я из CLOB поля таблички):
-Моя изначальная процедура исполняется около 20 секунд.
-Вариант с плоской таблицей, по наброску Дениса - 1 минуту 5 секунд.
-Вариант с DBMS_XMLDOM (приведенный ниже) - около 3 секунд. При этом если закомментировать собственно INSERT и MERGE (т.е. по сути оставить только парсинг) - то исполняется примерно за 600 мсек, что на данный момент меня более чем устраивает.
-Если будет время, попробую вариант с DBMS_XMLSTORE + view "распихивающий" данные по 2-м таблицам. Но боюсь что на реальной базе это будет неприемлемо медленно из-за огромного количества вспомогательных запросов на "наличие записи", даже учитывая что каждый такой запрос идёт по уникальному индексу... Всё-же 60 запросов куда как приятнее нежели 12000 :)

В общем промежуточный лидер забега - DBMS_XMLDOM :) Хотя я думаю что SAX парсер на Java был бы не медленнее (увы, нет возможности проверить это).

И конечно небольшое разочарование - на нашем кривом девелоперском сервере (давно уже надо всё переставлять, а то "недопатченный" 9.2.0.7 с некогда хранящимися в SYSTEM пользовательскими данными, переживший к тому-же пару серьёзных сбоев ОС - это та ещё "радость") вариант с DBMS_XMLDOM не работает вовсе - пресловутая ORA-06502: PL/SQL: numeric or value error: raw variable length too long

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
CREATE OR REPLACE PROCEDURE load_temporal_parameters3 (p_xml IN CLOB)
IS
   v_doc            DBMS_XMLDOM.domdocument;
   v_list_m         DBMS_XMLDOM.domnodelist;
   v_element_m      DBMS_XMLDOM.domelement;
   v_wellbore_id    m.w%TYPE;
   v_time           m.t%TYPE;
   v_new_id         m.ID%TYPE;
   v_list_v         DBMS_XMLDOM.domnodelist;
   v_element_v      DBMS_XMLDOM.domelement;
   v_parameter_id   v.p%TYPE;
   v_value          v.v%TYPE;
BEGIN
   v_doc := DBMS_XMLDOM.newdomdocument (p_xml);
   v_list_m := DBMS_XMLDOM.getelementsbytagname (v_doc, 'M');

   FOR i IN  0  .. DBMS_XMLDOM.getlength (v_list_m) -  1 
   LOOP
      v_element_m := DBMS_XMLDOM.makeelement (DBMS_XMLDOM.item (v_list_m, i));
      v_wellbore_id :=
                      TO_NUMBER (DBMS_XMLDOM.getattribute (v_element_m, 'w'));
      v_time :=
         TO_DATE (DBMS_XMLDOM.getattribute (v_element_m, 't'),
                  'YYYY.MM.DD HH24:MI:SS'
                 );

      BEGIN
         SELECT ID
           INTO v_new_id
           FROM m
          WHERE w = v_wellbore_id AND t = v_time;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            SELECT seq_m.NEXTVAL
              INTO v_new_id
              FROM DUAL;

            INSERT INTO m
                        (ID, w, t
                        )
                 VALUES (v_new_id, v_wellbore_id, v_time
                        );
      END;

      v_list_v := DBMS_XMLDOM.getchildrenbytagname (v_element_m, 'V');

      FOR j IN  0  .. DBMS_XMLDOM.getlength (v_list_v) -  1 
      LOOP
         v_element_v :=
                     DBMS_XMLDOM.makeelement (DBMS_XMLDOM.item (v_list_v, j));
         v_parameter_id :=
                      TO_NUMBER (DBMS_XMLDOM.getattribute (v_element_v, 'p'));
         v_value := TO_NUMBER (DBMS_XMLDOM.getattribute (v_element_v, 'v'));
         MERGE INTO v
            USING (SELECT v_new_id m_id, v_parameter_id p, v_value v
                     FROM DUAL) nv
            ON (v.m_id = nv.m_id AND v.p = nv.p)
            WHEN MATCHED THEN
               UPDATE
                  SET v.v = nv.v
            WHEN NOT MATCHED THEN
               INSERT (m_id, p, v)
               VALUES (nv.m_id, nv.p, nv.v);
      END LOOP;
   END LOOP;

   DBMS_XMLDOM.freedocument (v_doc);
END;
/

Попутно возник ещё один вопрос - процедура за запуск (на чистой базе) генерирует 6.5Мб редо лога, если сразу после этого выполнить (в блоке BEGIN ... END) Два INSERT ... SELECT эффективно "удваивающих" данные (ну, конечно, со смещениями дабы не нарушать уникальных констрейнов) - то эта операция генерирует всего лишь 1.5 Мб лога - что может быть причиной подобного отличия? Порядок следования операций вставки? "чередующийся" в одном случае и "сплошной" в другом? Тот факт что первая операция исполняется на пустых таблицах а вторая на уже заполненных? Или какие-то особенности вычисления статистики TOAD-ом, о которых я не знаю?

WBR, Igor
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XML в Oracle9i. Примеры разборки
    #36524738
Zloxaоно?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> select XmlType (
   2   '<ApplicationFile>
  3  <ttt>
  4  <ggg>234</ggg>
  5  <no_text><no_text></no_text></no_text>
  6  </ttt>
  7  <no_text></no_text>
  8  <ttt>111</ttt>
  9  </ApplicationFile>
 10  '
  11          ).transform (
  12            XmlType (
  13   '<?xml version="1.0"?>
 14  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 15    <xsl:template match="*">
 16      <xsl:element name="{local-name()}">
 17        <xsl:call-template name="rec"/>
 18      </xsl:element>
 19    </xsl:template>
 20    <xsl:template name="rec">
 21       <xsl:for-each select="child::node()">
 22          <xsl:if test=".//text()">
 23            <xsl:copy>
 24              <xsl:value-of select="text()"/>
 25              <xsl:call-template name="rec"/>
 26            </xsl:copy>
 27          </xsl:if>
 28       </xsl:for-each>
 29    </xsl:template>
 30  </xsl:stylesheet>'
  31            )
  32          ).getStringVal() no_empty_element
  33   from DUAL;
 
NO_EMPTY_ELEMENT
--------------------------------------------------------------------------------
<ApplicationFile>
  <ttt>
    <ggg> 234 </ggg>
  </ttt>
  <ttt> 111 </ttt>
</ApplicationFile>
 


Если у тега есть атрибуты, то данное преобразование их удаляет. Возможно это как то решить на 9-ке?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #36524758
Извиняюсь, поясню - приведенное выше преобразование XML удаляет пустые теги. Но, как выяснилось, удаляет также атрибуты тегов, если они присутствуют. Вот и хотелось бы узнать, как проще всего сделать так, чтобы они оставались.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XML в Oracle9i. Примеры разборки
    #38388933
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Без вас не разберусь, но очень хочется. Пошли вторые сутки как я не могу распарсить простенький xml с использованием пакета XMLDOM и постов на этом замечательно форуме. Многое прочитано и осознано, но тщетно. Без обращения к светилам не обойтись. Прошу вас не пройти мимо и помочь. Вам понравиться. =)
Вот мой(ваш) ‘код’:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
declare 

   v_doc            xmldom.domdocument;
   
   
   v_list_person    xmldom.domnodelist;
   v_element_person   xmldom.domelement;
   
   
   
   
   v_list_name      xmldom.domnodelist;
   v_element_name   xmldom.domelement;
   v_first_name     VARCHAR2(100);
   v_second_name    VARCHAR2(100);
   v_last_name      VARCHAR2(100);
   v_dob            DATE;
   
   v_list_passport  xmldom.domnodelist;
   v_element_passport xmldom.domelement;
   v_sernum         VARCHAR2(100);
   v_doc_date       VARCHAR2(100);
   
   
   p_xml clob;

begin 
   
  p_xml := XMLTYPE(
 '<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991"/>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report>
').getclobval();

  v_doc := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname (v_doc, 'Person');
  
  
  
  
  FOR i IN 0 .. xmldom.getlength (v_list_person) - 1
  loop
        
       v_list_name := xmldom.getelementsbytagname (v_doc, 'Name');
       
              FOR i IN 0 .. xmldom.getlength (v_list_name) - 1
               LOOP
                  v_element_name := xmldom.makeelement (xmldom.item (v_list_name, i));
                  v_first_name := xmldom.getattribute (v_element_name, 'n');
                  v_second_name := xmldom.getattribute (v_element_name, 'm');
                  v_last_name := xmldom.getattribute (v_element_name, 's');
                  v_dob := xmldom.getattribute (v_element_name, 'd'); 
                  
                 DBMS_OUTPUT.PUT_LINE(v_last_name ||'  '|| v_first_name ||' '||  v_second_name  ||' '||  v_dob);
                 
                    v_list_passport  := xmldom.getelementsbytagname (v_doc, 'Passport');
                 
                 
                           FOR j IN 0 .. xmldom.getlength (v_list_passport) - 1
                           LOOP 
                                    
                              v_element_passport := xmldom.makeelement (xmldom.item (v_list_passport, j));
                              v_sernum  := xmldom.getattribute (v_element_passport, 'pn');
                              v_doc_date  := xmldom.getattribute (v_element_passport, 'pd');

                                DBMS_OUTPUT.PUT_LINE(v_sernum ||' '||  v_doc_date);
              
                            end loop;
                         
                 
                                  
             END LOOP;
             
            
                                
             
  END LOOP; 
  
   XMLDOM.freedocument (v_doc);
   
end;   





Как мне получить следующий вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
КОНУСЕВА  МАЯ ВАЛЕНТИНОВНА 12.12.1980
1212121212 30.05.1991
ИВАНОВА  МАРИНА ИВАНОВНА 27.12.1980
2121212121 17.06.1990
1313131313 24.08.1996
МИЛОБОКОВА ОЛЬГА ИВАНОВНА 05.12.1980
6504153760 25.04.1993
6508483028 26.11.1998
?
Т.е. чтобы каждой фио соответствовали данные из паспорта.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389090
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Год прошел, но может кто-нибудь заметит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389104
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Год прошел, но может кто-нибудь заметит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389118
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,

заметил. читайте про xmldom.getChildNodes
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389155
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,


в качестве примера
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
declare

  v_doc xmldom.domdocument;

  v_list_person    xmldom.domnodelist;
  v_element_person xmldom.domelement;

  v_list_name    xmldom.domnodelist;
  v_element_name xmldom.domelement;
  v_first_name   varchar2(100);
  v_second_name  varchar2(100);
  v_last_name    varchar2(100);
  v_dob          date;

  v_list_passport    xmldom.domnodelist;
  v_element_passport xmldom.domelement;
  v_sernum           varchar2(100);
  v_doc_date         varchar2(100);

  p_xml          clob;
  l_children     dbms_xmldom.domnodelist;
  l_child        dbms_xmldom.domnode;
  l_text_content varchar2(32767);

begin
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991"/>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report>
').getclobval();

  v_doc         := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname(v_doc, 'Person');
  for i in 0 .. xmldom.getlength(v_list_person) - 1
  loop
      l_child := xmldom.item(v_list_person, i);
      l_children := xmldom.getchildnodes(l_child);
      for j in 0 .. xmldom.getlength(l_children) - 1
      loop
        l_child        := dbms_xmldom.item(l_children, j);
        l_text_content := xmldom.getnodename(l_child);
        if l_text_content = 'Name' then
          dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'n'));
        end if;
        if l_text_content = 'Passport' then
          dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'pn'));
        end if;
      end loop;
  end loop;
end;
  

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389340
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,
ага, спасибо. =))
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38390751
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй, что-то не могу въехать. Допустим в xml появился новый тэг citizen:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991">
              <Citizen n="UA"/>
      </Passport>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report> 



как его вывести в таком виде:

КОНУСЕВА МАЯ ВАЛЕНТИНОВНА 12.12.1980
1212121212 30.05.1991
UA
ИВАНОВА МАРИНА ИВАНОВНА 27.12.1980
2121212121 17.06.1990
1313131313 24.08.1996
МИЛОБОКОВА ОЛЬГА ИВАНОВНА 05.12.1980
6504153760 25.04.1993
6508483028 26.11.1998

?
Попробовала несколько более или менее логичных вариантов (и продолжаю), но что-то с циклами не то или с местом объявления нодов. Подскажите.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38390975
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобралась:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
declare

  v_doc xmldom.domdocument;

  v_list_person    xmldom.domnodelist;
  v_element_person xmldom.domelement;

  v_list_name    xmldom.domnodelist;
  v_element_name xmldom.domelement;
  v_first_name   varchar2(100);
  v_second_name  varchar2(100);
  v_last_name    varchar2(100);
  v_dob          date;

  v_list_passport    xmldom.domnodelist;
  v_element_passport xmldom.domelement;
  v_sernum           varchar2(100);
  v_doc_date         varchar2(100);

  p_xml          clob;
  l_children     dbms_xmldom.domnodelist;
  l_child        dbms_xmldom.domnode;
  l_text_content varchar2(32767);

begin
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
       <Passport pn="1212121212" pd="30.05.1991">
              <Citizen f="UA"/>
      </Passport>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report>
').getclobval();

  v_doc         := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname(v_doc, 'Person');
  for i in 0 .. xmldom.getlength(v_list_person) - 1
  loop
      l_child := xmldom.item(v_list_person, i);
      l_children := xmldom.getchildnodes(l_child);
              for j in 0 .. xmldom.getlength(l_children) - 1
              loop
                l_child        := dbms_xmldom.item(l_children, j);
                l_text_content := xmldom.getnodename(l_child);
                if l_text_content = 'Name' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'n'));
                end if;
                      
                                     
                
                
                
                if l_text_content = 'Passport' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'pn'));
                  l_children := xmldom.getchildnodes(l_child);
                  
                  dbms_output.put_line('len ' || xmldom.getlength(l_children) );
                         FOR d IN 0 .. xmldom.getlength(l_children) - 1 LOOP
                            l_child        := dbms_xmldom.item(l_children, d);
                            l_text_content := xmldom.getnodename(l_child);
                                     if l_text_content = 'Citizen' then
                                    dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'f'));
                                    end if;
                         
                         
                         END LOOP;

                      
                  
                end if;
              end loop;
  end loop;
end;

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38391752
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй, что-то не могу въехать. Допустим в xml появился новый тэг citizen:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991">
              <Citizen n="UA"/>
      </Passport>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report> 



как его вывести в таком виде:

КОНУСЕВА МАЯ ВАЛЕНТИНОВНА 12.12.1980
1212121212 30.05.1991
UA
ИВАНОВА МАРИНА ИВАНОВНА 27.12.1980
2121212121 17.06.1990
1313131313 24.08.1996
МИЛОБОКОВА ОЛЬГА ИВАНОВНА 05.12.1980
6504153760 25.04.1993
6508483028 26.11.1998

?
Попробовала несколько более или менее логичных вариантов (и продолжаю), но что-то с циклами не то или с местом объявления нодов. Подскажите.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38391787
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,
очень невнимательны. почему используете одни и теже переменные ?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
v_doc         := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname(v_doc, 'Person');
  for i in 0 .. xmldom.getlength(v_list_person) - 1
  loop
       l_child := xmldom.item(v_list_person, i); 
      l_children := xmldom.getchildnodes(l_child);
              for j in 0 .. xmldom.getlength(l_children) - 1
              loop
                l_child        := dbms_xmldom.item(l_children, j); 
                l_text_content := xmldom.getnodename(l_child);
                if l_text_content = 'Name' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'n'));
                end if;
                      
                                     
                
                
                
                if l_text_content = 'Passport' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'pn'));
                  l_children := xmldom.getchildnodes(l_child);
                  
                  dbms_output.put_line('len ' || xmldom.getlength(l_children) );
                         FOR d IN 0 .. xmldom.getlength(l_children) - 1 LOOP
                            l_child        := dbms_xmldom.item(l_children, d); 
                            l_text_content := xmldom.getnodename(l_child);
                                     if l_text_content = 'Citizen' then
                                    dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'f'));
                                    end if;
                         
                         
                         END LOOP;

                      
                  
                end if;
              end loop;
  end loop;
end;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499692
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
create or replace procedure PR_DL_GPX(
--gpx in CLOB, 
--cur in out pkg_cursors.CurType
x in integer
) is

v_doc            dbms_xmldom.domdocument;
v_l_trkseg       dbms_xmldom.domnodelist;

v_l_trkpt        dbms_xmldom.domnodelist;
v_e_trkpt        dbms_xmldom.domelement;

v_l_dt           dbms_xmldom.domnodelist;
v_e_dt           dbms_xmldom.domelement;

lat              varchar2(20);
lon              varchar2(20);
dt               varchar2(20);
ele              varchar2(20);

gpx              clob;
begin
  
gpx := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="GNSS Data Interface">
  <trk>
    <name>GNSS Data Interface</name>
    <trkseg>
      <trkpt lat="61.6666343389" lon="50.8176451879">
        <time>2013-12-04T08:33:12Z</time>
        <ele>125.42</ele>
      </trkpt>
      <trkpt lat="61.6642848542" lon="50.8183690557">
        <time>2013-12-04T09:20:01Z</time>
        <ele>97.28</ele>
      </trkpt>
    </trkseg>
  </trk>
</gpx>
').GetStringVal();--getclobval();

v_doc := dbms_xmldom.newdomdocument(gpx);
v_l_trkseg := dbms_xmldom.getelementsbytagname (v_doc, 'trkseg');

for i in 0 .. dbms_xmldom.getlength (v_l_trkseg) - 1
loop

    v_l_trkpt := dbms_xmldom.getelementsbytagname (v_doc, 'trkpt');
    for j in 0 .. dbms_xmldom.getlength (v_l_trkpt) - 1
    loop
        
        v_e_trkpt := dbms_xmldom.makeelement (dbms_xmldom.item (v_l_trkpt, j));
        lat := dbms_xmldom.getattribute (v_e_trkpt, 'lat');
        lon := dbms_xmldom.getattribute (v_e_trkpt, 'lon');
        
        -- КАК ЗДЕСЬ ПОЛУЧИТЬ значения time and ele

    end loop;

end loop;

dbms_xmldom.freedocument (v_doc);

end PR_DL_GPX;



Все хорошо все работает, но не знаю как выташить данные без атрибута, например
<time>2013-12-04T08:33:12Z</time>
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499730
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DIGITALPRO,

проще же, быстрее и понятнее через xmltable:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select *
from xmltable(xmlnamespaces(default 'http://www.topografix.com/GPX/1/1'),
              '/gpx/trk/trkseg/trkpt'
              passing xmltype(
                  '<?xml version="1.0" encoding="UTF-8"?>
                  <gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="GNSS Data Interface">
                    <trk>
                      <name>GNSS Data Interface</name>
                      <trkseg>
                        <trkpt lat="61.6666343389" lon="50.8176451879">
                          <time>2013-12-04T08:33:12Z</time>
                          <ele>125.42</ele>
                        </trkpt>
                        <trkpt lat="61.6642848542" lon="50.8183690557">
                          <time>2013-12-04T09:20:01Z</time>
                          <ele>97.28</ele>
                        </trkpt>
                      </trkseg>
                    </trk>
                  </gpx>
                  '
                  )
               columns 
                  lat    number        path '@lat'
                 ,lon    number        path '@lon'
                 ,"time" timestamp     path 'substring(time,1,19)'
                 ,ele    number        path 'ele'
               )

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499836
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Незнал этого, спасибо!, НО

1. без подсказки /*+ CURSOR_SHARING_EXACT */ не работает
2. результат селекта 0 rows
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499854
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DIGITALPRO,

версия оракла какая?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499861
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

10-я
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499866
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPRO,

namespace укажи. и глюков с cursor_sharing не exact до 11й версии больше, чем в 11й. Да и с xmltable тоже.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499916
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DIGITALPRO,

а конкретнее?
на 10.2.0.4 это работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> select * from v$version;

BANNER
----------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Solaris: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select/*+ cursor_sharing_exact */ *
from xmltable(xmlnamespaces(default 'http://www.topografix.com/GPX/1/1'),
              '/gpx/trk/trkseg/trkpt'
              passing xmltype(
                  '<?xml version="1.0" encoding="UTF-8"?>
                  <gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="GNSS Data Interface">
                    <trk>
                      <name>GNSS Data Interface</name>
                      <trkseg>
                        <trkpt lat="61.6666343389" lon="50.8176451879">
                          <time>2013-12-04T08:33:12Z</time>
                          <ele>125.42</ele>
                        </trkpt>
                        <trkpt lat="61.6642848542" lon="50.8183690557">
                          <time>2013-12-04T09:20:01Z</time>
                          <ele>97.28</ele>
                        </trkpt>
                      </trkseg>
                    </trk>
                  </gpx>
                  '
                  )
               columns 
                  lat    number        path '@lat'
                 ,lon    number        path '@lon'
                 ,"time" varchar2(100) path 'time'
                 ,ele    number        path 'ele'
               )

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499936
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

версия

1 Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
2 PL/SQL Release 10.2.0.5.0 - Production
3 CORE 10.2.0.5.0 Production
4 TNS for Linux: Version 10.2.0.5.0 - Production
5 NLSRTL Version 10.2.0.5.0 - Production


А так все заработало, спасибо!!!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499940
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

только

в '/trk/trkseg/trkpt'
сделали '//trk/trkseg/trkpt'
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XML в Oracle9i. Примеры разборки
    #38873286
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже запутался, вот пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
declare
 xRetClob clob;
 xRet number;
 xRetXml XMLTYPE;
begin
  xRetClob := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>';
  xRetXml := XMLTYPE(xRetClob);
  
  FOR cr_result IN
    (
     select 
      cast(extract(Value(p), 'item/dF1 /text()').getStringVal() as NUMBER) df_1,
      cast(extract(Value(p), 'item/dF2 /text()').getStringVal() as NUMBER) df_2,
      cast(extract(Value(p), 'item/dF3 /text()').getStringVal() as NUMBER) df_3,
      cast(extract(Value(p), 'item/dF4 /text()').getStringVal() as NUMBER) df_4
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//Body/getData/response/item', 'xmlns:x="http://www.test.ru/test/test/types/type1/v1"'))) p
    )
    LOOP    
      xRet := to_number(cr_result.df_1);
      dbms_output.put_line(xRet);
    END LOOP;
end;


ничего не показывает, а так хочется в цикле всё обработать.
Чувствую, что засада в неймспейсах, но понять не могу.
спасибо всем откликнувшимся.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873389
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,
Даю наводку (слитно) :
select count(1)
from
Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'))) p
возвращает 1 строку
select count(1)
from
Table(XMLSEQUENCE(EXTRACT(xRetXml,'//Body/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'))) p
возвращает 0 строк
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873405
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

это мне сначала достать из soapenv, потом из NS1 и только потом из NSx?..
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873411
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,
select extract(Value(p), '*/node()')
from
Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/*', 'xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1'))) p;
Если совсем коротко, soapenv:Body и Body это разные элементы, поэтому надо писать весь путь с ns. Соответственно их все надо определить третим парвметром (через пробел можно)
Получилось?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873416
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,

И еще, у тебя есть NS3:item и NS4:item. Через ось по направлению ты их одновременно не получишь, нужно ставить условие. Если мне не изменяет память тебе нужна xpath функция local_name() или както так....
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873424
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickroadster,

И еще, у тебя есть NS3:item и NS4:item. Через ось по направлению ты их одновременно не получишь, нужно ставить условие. Если мне не изменяет память тебе нужна xpath функция local_name() или както так....
Вспомнил, так:
Код: plsql
1.
2.
3.
select  extract(Value(p), '*/node()') 
      from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//*[local-name()="item"]'))) p
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873459
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

Код: plsql
1.
2.
3.
4.
select 
      cast(extract(Value(p), 'item/dF1 /text()', 'xmlns:x="http://www.test.ru/test/test/types/type1/v1"').getStringVal() as NUMBER) df_1
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p


так получается, но в значениях пусто...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873466
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickВспомнил, так:огромное спасибо, почти добил
Код: plsql
1.
2.
3.
4.
select 
      cast(extract(Value(p), 'dF1 /text()').getStringVal() as NUMBER) df_1
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*[local-name()="item"]/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p

так получает значения в итемах, но пустые.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873504
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

спасибочки огромное, сделано и заработало
кому интересно в спойлере (с кривым выводом, ну да мне просто проверить)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
declare
 xRetClob clob;
 xRet varchar2(10);
 xRet1 varchar2(10);
 xRet2 varchar2(10);
 xRet3 varchar2(10);
 xRet4 varchar2(10);
 xRetXml XMLTYPE;
begin
  xRetClob := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>';
  xRetXml := XMLTYPE(xRetClob);
  
  FOR cr_result IN
    (
     select 
      extractValue(Value(p), '/*[local-name()="staty"]') staty,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_1,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_2,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_3,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_4
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*[local-name()="item"]/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p
    )
    LOOP    
      xRet := cr_result.staty;
      dbms_output.put_line(xRet);
      xRet1 := cr_result.df_1;
      dbms_output.put_line(xRet1);
      xRet2 := cr_result.df_2;
      dbms_output.put_line(xRet2);
      xRet3 := cr_result.df_3;
      dbms_output.put_line(xRet3);
      xRet4 := cr_result.df_4;
      dbms_output.put_line(xRet4);
    END LOOP;
exception
  when others then dbms_output.put_line(SQLERRM);
end;

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873532
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
WITH t AS (
           SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>') xRetXml
             FROM  DUAL
          )
SELECT  staty,
        df_1,
        df_2,
        df_3,
        df_4
  FROM  t,
        XMLTABLE(
                 XMLNAMESPACES(
                               'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                               'http://www.test.ru/test/test/service/service1/v1' as "NS1",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS2",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS3",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS4"
                              ),
                 '/soapenv:Envelope/soapenv:Body/NS1:getData/response/NS4:item'
                 PASSING xRetXml
                 COLUMNS
                   staty NUMBER PATH 'NS4:staty',
                   df_1  NUMBER PATH 'NS4:dF1',
                   df_2  NUMBER PATH 'NS4:dF2',
                   df_3  NUMBER PATH 'NS4:dF3',
                   df_4  NUMBER PATH 'NS4:dF4'
                )
/

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1000          0          0          0          0
      1100          0          0          0          0

SQL> 



Почему возвращает две строки? NS3 и NS4 namespaces идентичны. Если изменить NS4 на http://www.test.ru/test/test/types/type1/v2 то мое решение вернет именно NS4:item а вот решение от ArtNick/roadster все равно вернет все item этого уровня независимо от namespace:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
SQL> WITH t AS (
  2             SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/en
velope/">
  3     <soapenv:Body>
  4        <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
  5           <response>
  6              <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
  7                 <NS2:statusCode>0</NS2:statusCode>
  8                 <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
  9              </NS2:status>
 10              <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
 11                 <NS3:staty>1000</NS3:staty>
 12                 <NS3:dF1>0.00</NS3:dF1>
 13                 <NS3:dF2>0.00</NS3:dF2>
 14                 <NS3:dF3>0.00</NS3:dF3>
 15                 <NS3:dF4>0.00</NS3:dF4>
 16              </NS3:item>
 17              <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v2">
 18                 <NS4:staty>1100</NS4:staty>
 19                 <NS4:dF1>0.00</NS4:dF1>
 20                 <NS4:dF2>0.00</NS4:dF2>
 21                 <NS4:dF3>0.00</NS4:dF3>
 22                 <NS4:dF4>0.00</NS4:dF4>
 23              </NS4:item>
 24           </response>
 25        </NS1:getData>
 26     </soapenv:Body>
 27  </soapenv:Envelope>') xRetXml
 28               FROM  DUAL
 29            )
 30  SELECT  staty,
 31          df_1,
 32          df_2,
 33          df_3,
 34          df_4
 35    FROM  t,
 36          XMLTABLE(
 37                   XMLNAMESPACES(
 38                                 'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
 39                                 'http://www.test.ru/test/test/service/service1/v1' as "NS1",
 40                                 'http://www.test.ru/test/test/types/type1/v1' as "NS2",
 41                                 'http://www.test.ru/test/test/types/type1/v1' as "NS3",
 42                                 'http://www.test.ru/test/test/types/type1/v2' as "NS4"
 43                                ),
 44                   '/soapenv:Envelope/soapenv:Body/NS1:getData/response/NS4:item'
 45                   PASSING xRetXml
 46                   COLUMNS
 47                     staty NUMBER PATH 'NS4:staty',
 48                     df_1  NUMBER PATH 'NS4:dF1',
 49                     df_2  NUMBER PATH 'NS4:dF2',
 50                     df_3  NUMBER PATH 'NS4:dF3',
 51                     df_4  NUMBER PATH 'NS4:dF4'
 52                  )
 53  /

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1100          0          0          0          0

SQL> declare
  2   xRetClob clob;
  3   xRet varchar2(10);
  4   xRet1 varchar2(10);
  5   xRet2 varchar2(10);
  6   xRet3 varchar2(10);
  7   xRet4 varchar2(10);
  8   xRetXml XMLTYPE;
  9  begin
 10    xRetClob := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
 11     <soapenv:Body>
 12        <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
 13           <response>
 14              <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
 15                 <NS2:statusCode>0</NS2:statusCode>
 16                 <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
 17              </NS2:status>
 18              <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
 19                 <NS3:staty>1000</NS3:staty>
 20                 <NS3:dF1>0.00</NS3:dF1>
 21                 <NS3:dF2>0.00</NS3:dF2>
 22                 <NS3:dF3>0.00</NS3:dF3>
 23                 <NS3:dF4>0.00</NS3:dF4>
 24              </NS3:item>
 25              <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v2">
 26                 <NS4:staty>1100</NS4:staty>
 27                 <NS4:dF1>0.00</NS4:dF1>
 28                 <NS4:dF2>0.00</NS4:dF2>
 29                 <NS4:dF3>0.00</NS4:dF3>
 30                 <NS4:dF4>0.00</NS4:dF4>
 31              </NS4:item>
 32           </response>
 33        </NS1:getData>
 34     </soapenv:Body>
 35  </soapenv:Envelope>';
 36    xRetXml := XMLTYPE(xRetClob);
 37  
 38    FOR cr_result IN
 39      (
 40       select
 41        extractValue(Value(p), '/*[local-name()="staty"]') staty,
 42        extractValue(Value(p), '/*[local-name()="dF1"]') df_1,
 43        extractValue(Value(p), '/*[local-name()="dF1"]') df_2,
 44        extractValue(Value(p), '/*[local-name()="dF1"]') df_3,
 45        extractValue(Value(p), '/*[local-name()="dF1"]') df_4
 46       from
 47       Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*[local-name()="ite
m"]/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/tes
t/test/service/service1/v1"'))) p
 48      )
 49      LOOP
 50        xRet := cr_result.staty;
 51        dbms_output.put_line(xRet);
 52        xRet1 := cr_result.df_1;
 53        dbms_output.put_line(xRet1);
 54        xRet2 := cr_result.df_2;
 55        dbms_output.put_line(xRet2);
 56        xRet3 := cr_result.df_3;
 57        dbms_output.put_line(xRet3);
 58        xRet4 := cr_result.df_4;
 59        dbms_output.put_line(xRet4);
 60      END LOOP;
 61  exception
 62    when others then dbms_output.put_line(SQLERRM);
 63  end;
 64  /
1000
0.00
0.00
0.00
0.00
1100
0.00
0.00
0.00
0.00

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873541
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYа вот решение от ArtNick/roadster все равно вернет все item этого уровня независимо от namespace:да, именно это мне и надо.
не я формирую ответ, набор итемов может быть достаточно большой (на тестовом ответе их 64, но это не предел, другой сервис вернул 4642 итема с другой структурой), мне надо их разобрать и положить в таблицу.
но это конкретно мой случай.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873546
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

и неймспейсы не меняются для итемов.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873580
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправил, чтобы не 10 строк выводилось
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
declare
 xRetClob clob;
 xRet varchar2(10);
 xRet1 varchar2(10);
 xRet2 varchar2(10);
 xRet3 varchar2(10);
 xRet4 varchar2(10);
 l_rn NUMBER;
 xRetXml XMLTYPE;
begin
  xRetClob := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>1.00</NS3:dF2>
               <NS3:dF3>2.00</NS3:dF3>
               <NS3:dF4>3.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>4.00</NS4:dF1>
               <NS4:dF2>5.00</NS4:dF2>
               <NS4:dF3>6.00</NS4:dF3>
               <NS4:dF4>7.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>';
  xRetXml := XMLTYPE(xRetClob);
  
  FOR cr_result IN
    (
     select rownum as rn, 
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="staty"] /text()') staty,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF1"] /text()') df_1,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF2"] /text()') df_2,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF3"] /text()') df_3,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF4"] /text()') df_4
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p
    )
    LOOP
      l_rn := cr_result.rn;
      IF cr_result.staty IS NOT NULL THEN xRet := cr_result.staty; END IF;
      IF cr_result.df_1 IS NOT NULL THEN xRet1 := cr_result.df_1; END IF;
      IF cr_result.df_2 IS NOT NULL THEN xRet2 := cr_result.df_2; END IF;
      IF cr_result.df_3 IS NOT NULL THEN xRet3 := cr_result.df_3; END IF;
      IF cr_result.df_4 IS NOT NULL THEN xRet4 := cr_result.df_4; END IF;
      --IF MOD(l_rn, 5) = 0 THEN
        dbms_output.put_line(l_rn || ' staty=' || xRet || '; dF1=' || xRet1 || '; dF2=' ||xRet2 || '; dF3=' ||xRet3 || '; dF4=' ||xRet4);
     -- END IF;
    END LOOP;
exception
  when others then dbms_output.put_line(SQLERRM);
end;

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873711
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
я тоже подобные запросы пишу только через XMLTABLE, но автор пишет о 9 версии. Вроде XMLTABLE c 10-й?
И еще на эту тему. Пару лет назад был проект с большим объемом парсинга XML, при это сами документы были с кучей ns, и что самое противное они постоянно менялись. То есть могли одновременно приходить как xmlns:NS3=" http://www.test.ru/test/test/types/type1/v1 так и xmlns:NS3=" http://www.test.ru/test/test/types/type1/v2 и т.д. Дабы не увязать в сопровождении я сделал так:
1. Трансформировал XML в простую структуру без ns посредством XQUERY, там можно прочитать ns в переменную и дальше юзать переменную
2. Парсил простую XML

У меня были сомнения в части веса такого подхода, все таки скриптовый язык, но, к удивлению, они исчезли после тестов.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874588
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

у меня 11 версия, но
ArtNickсами документы были с кучей ns, и что самое противное они постоянно менялись. То есть могли одновременно приходить как xmlns:NS3=" http://www.test.ru/test/test/types/type1/v1 так и xmlns:NS3=" http://www.test.ru/test/test/types/type1/v2 и т.д.у меня то же самое.
вариант с простой XML я рассмотрю, спасибо.
ЗЫ тему поднял, дабы не плодить.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874822
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
roadsterArtNick,

у меня 11 версия, но
ArtNickсами документы были с кучей ns, и что самое противное они постоянно менялись. То есть могли одновременно приходить как xmlns:NS3=" http://www.test.ru/test/test/types/type1/v1 так и xmlns:NS3=" http://www.test.ru/test/test/types/type1/v2 и т.д.у меня то же самое.
вариант с простой XML я рассмотрю, спасибо.
ЗЫ тему поднял, дабы не плодить.
разбор твоего XML с разными неймспейсами через wildcards:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t
/

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874825
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
чуть проще:
Код: plsql
1.
for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item return $r


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item return $r'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t
/


по идее вообще должно было бы хватить:
Код: plsql
1.
/soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item


но почему-то не работает(может глаза замылились и чего-то не замечаю),
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874841
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
судя по-всему просто очередной баг, т.к. при изменении типа столбцов в "columns" на xmltype все работает как надо:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select--+ NO_XML_QUERY_REWRITE
       v.xval
      ,xmlcast(df_1 as varchar2(10)) df1
      ,xmlcast(df_2 as varchar2(10)) df2
      ,xmlcast(df_3 as varchar2(10)) df3
      ,xmlcast(df_4 as varchar2(10)) df4
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              '/soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item'
              passing xmltype(v.xval)
              columns 
                  x xmltype path '.'
                 ,df_1 xmltype path './*:dF1'
                 ,df_2 xmltype path './*:dF2'
                 ,df_3 xmltype path './*:dF3'
                 ,df_4 xmltype path './*:dF4'
            ) t
/

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874854
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderпо идее вообще должно было бы хватить:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
WITH t AS (
           SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>') xRetXml
             FROM  DUAL
          )
SELECT  staty,
        df_1,
        df_2,
        df_3,
        df_4
  FROM  t,
        XMLTABLE(
                 XMLNAMESPACES(
                               'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                               'http://www.test.ru/test/test/service/service1/v1' as "NS1",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS2",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS3",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS4"
                              ),
                 '/soapenv:Envelope/soapenv:Body/NS1:getData/response/*:item'
                 PASSING xRetXml
                 COLUMNS
                   staty NUMBER PATH '*:staty',
                   df_1  NUMBER PATH '*:dF1',
                   df_2  NUMBER PATH '*:dF2',
                   df_3  NUMBER PATH '*:dF3',
                   df_4  NUMBER PATH '*:dF4'
                )
/

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1000          0          0          0          0
      1100          0          0          0          0

SQL> 



SY.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874863
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderразбор твоего XML с разными неймспейсами через wildcards:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t
/


Ты перечисляешь ns.Когда враги начнут http://www.test.ru/test/test/types/type1/v348 передавать придется придется скрипт менять, а лень. Я же имел в виду внутри xquery прочитать в переменные. И еще такая чисто субъективная привычка, для XMLTABLE () использую xpath а для XQUERY() - xquery....
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874888
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ArtNickТы перечисляешь ns.Когда враги начнут http://www.test.ru/test/test/types/type1/v348 передавать придется придется скрипт менять, а лень. Я же имел в виду внутри xquery прочитать в переменные. И еще такая чисто субъективная привычка, для XMLTABLE () использую xpath а для XQUERY() - xquery....бред-бред-бред...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
--                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
--                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/*:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874941
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderArtNickТы перечисляешь ns.Когда враги начнут http://www.test.ru/test/test/types/type1/v348 передавать придется придется скрипт менять, а лень. Я же имел в виду внутри xquery прочитать в переменные. И еще такая чисто субъективная привычка, для XMLTABLE () использую xpath а для XQUERY() - xquery....бред-бред-бред...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
--                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
--                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/*:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t


Ересь! Извлекать все подряд документы item это кто ж тебя такому учил. Если уж пишешь так хоть голову включай а не опу
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874969
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ArtNickИзвлекать все подряд документы itemа подумать?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874976
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SYxtenderпо идее вообще должно было бы хватить:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
WITH t AS (
           SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>') xRetXml
             FROM  DUAL
          )
SELECT  staty,
        df_1,
        df_2,
        df_3,
        df_4
  FROM  t,
        XMLTABLE(
                 XMLNAMESPACES(
                               'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                               'http://www.test.ru/test/test/service/service1/v1' as "NS1",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS2",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS3",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS4"
                              ),
                 '/soapenv:Envelope/soapenv:Body/NS1:getData/response/*:item'
                 PASSING xRetXml
                 COLUMNS
                   staty NUMBER PATH '*:staty',
                   df_1  NUMBER PATH '*:dF1',
                   df_2  NUMBER PATH '*:dF2',
                   df_3  NUMBER PATH '*:dF3',
                   df_4  NUMBER PATH '*:dF4'
                )
/

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1000          0          0          0          0
      1100          0          0          0          0

SQL> 




SY.а какая версия?
у меня на 11.2.0.3.11:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
SQL> set null -null-;
SQL> WITH t AS (
  2             SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  3     <soapenv:Body>
  4        <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
  5           <response>
  6              <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
  7                 <NS2:statusCode>0</NS2:statusCode>
  8                 <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
  9              </NS2:status>
 10              <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
 11                 <NS3:staty>1000</NS3:staty>
 12                 <NS3:dF1>0.00</NS3:dF1>
 13                 <NS3:dF2>0.00</NS3:dF2>
 14                 <NS3:dF3>0.00</NS3:dF3>
 15                 <NS3:dF4>0.00</NS3:dF4>
 16              </NS3:item>
 17              <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
 18                 <NS4:staty>1100</NS4:staty>
 19                 <NS4:dF1>0.00</NS4:dF1>
 20                 <NS4:dF2>0.00</NS4:dF2>
 21                 <NS4:dF3>0.00</NS4:dF3>
 22                 <NS4:dF4>0.00</NS4:dF4>
 23              </NS4:item>
 24           </response>
 25        </NS1:getData>
 26     </soapenv:Body>
 27  </soapenv:Envelope>') xRetXml
 28               FROM  DUAL
 29            )
 30  SELECT  staty,
 31          df_1,
 32          df_2,
 33          df_3,
 34          df_4
 35    FROM  t,
 36          XMLTABLE(
 37                   XMLNAMESPACES(
 38                                 'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
 39                                 'http://www.test.ru/test/test/service/service1/v1' as "NS1",
 40                                 'http://www.test.ru/test/test/types/type1/v1' as "NS2",
 41                                 'http://www.test.ru/test/test/types/type1/v1' as "NS3",
 42                                 'http://www.test.ru/test/test/types/type1/v1' as "NS4"
 43                                ),
 44                   '/soapenv:Envelope/soapenv:Body/NS1:getData/response/*:item'
 45                   PASSING xRetXml
 46                   COLUMNS
 47                     staty NUMBER PATH '*:staty',
 48                     df_1  NUMBER PATH '*:dF1',
 49                     df_2  NUMBER PATH '*:dF2',
 50                     df_3  NUMBER PATH '*:dF3',
 51                     df_4  NUMBER PATH '*:dF4'
 52                  )
 53  /

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
-null-     -null-     -null-     -null-     -null-
-null-     -null-     -null-     -null-     -null-

2 rows selected.

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874977
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderArtNickИзвлекать все подряд документы itemа подумать?
Вот это я тебе и предложил! Не извлекать все item из документа а тольком NS3:item и NS4:item иначе рискуеш JOPA:item получить. При это вне зависимости от версии схемы, в которой элементы объявлены
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874979
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickЕресь! Извлекать все подряд документы item это кто ж тебя такому учил. Если уж пишешь так хоть голову включай а не опу

Не документы, а узлы документa (nodes). И не все, а только на ветке /soapenv:Envelope/soapenv:Body/NS1:getData/response. Ну и самое главное - а что твое решешие не извлекает все items на ветке?

SY.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874981
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

спасибо, возьму на заметку.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874987
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYArtNickЕресь! Извлекать все подряд документы item это кто ж тебя такому учил. Если уж пишешь так хоть голову включай а не опу

Не документы, а узлы документa (nodes). И не все, а только на ветке /soapenv:Envelope/soapenv:Body/NS1:getData/response. Ну и самое главное - а что твое решешие не извлекает все items на ветке?

SY.

Не узлы а элементы, рас уж ратуешь за правильную терминологию то пользуйся стандартной.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875039
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYПочему возвращает две строки? NS3 и NS4 namespaces идентичны. Если изменить NS4 на http://www.test.ru/test/test/types/type1/v2 то мое решение вернет именно NS4:item а вот решение от ArtNick/roadster все равно вернет все item этого уровня независимо от namespace:
SY.
Об этом и говорили выше.
Менять же документ на стоит, он такой какой есть.
Парсить его лучше так:
1. объявить ns, их 3.
3. парсить по объявленным ns
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
declare
 cd xmltype;
begin
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select xmltype(v.xval) into cd from v;
open :the_cursor for
 select xmlquery (' declare namespace service ="http://www.test.ru/test/test/service/service1/v1";
                    declare namespace type ="http://www.test.ru/test/test/types/type1/v1";
                    declare namespace soapenv ="http://schemas.xmlsoap.org/soap/envelope/";
                    <AllData>
                    {
                    for $i in  soapenv:Envelope/soapenv:Body/service:getData/response/type:item
                    return 
                        <Item dF1="{$i/type:dF1/text()}" dF2="{$i/type:dF2/text()}" dF3="{$i/type:dF3/text()}" dF4="{$i/type:dF4/text()}"/>
                    }                    
                    </AllData>
 '                    
                  passing cd
                  returning content) from dual;
end;


и тогда хоть NS3, NS4, NS248 -
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875057
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ArtNickПарсить его лучше так:
1. объявить ns, их 3.
3. парсить по объявленным nsидиотский оверкил...
и чем тебе указание xmlnamespaces в xmltable тогда не понравилось?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875083
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick, "Парсить его лучше так:"

Балобол, ты уверен, что ты воспринимаем?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875100
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderArtNickПарсить его лучше так:
1. объявить ns, их 3.
3. парсить по объявленным nsидиотский оверкил...
и чем тебе указание xmlnamespaces в xmltable тогда не понравилось?

Стоп, отматываем немного назад.
1. В документе 3 ns: http://schemas.xmlsoap.org/soap/envelope/, http://www.test.ru/test/test/service/service1/v1, http://www.test.ru/test/test/types/type1/v1
2. на http://www.test.ru/test/test/types/type1/v1 ссылается 3 префикса : NS2, NS3, NS4
3. local-name или wildcard в префиксе вернет не только item из http://www.test.ru/test/test/types/type1/v1 но и item из любых других ns в том числе и JOPA (JOPA это URI а не префикс), что неправильно.
4.Выборка c перечисление всех префиксов будет умножать результат (пример SY)
3. xmlnamespaces в xmltable- да на здоровье, только не прописывай все префиксы, достаточно одного.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
declare
 cd xmltype;
begin
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select xmltype(v.xval) into cd from v;
open :the_cursor for
 select * from
  xmltable (XMLNAMESPACES('http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                          'http://www.test.ru/test/test/service/service1/v1' as "NS1",
                          'http://www.test.ru/test/test/types/type1/v1' as "NS3"),
            'soapenv:Envelope/soapenv:Body/NS1:getData/response/NS3:item'
           passing cd
          COLUMNS
          df_1  NUMBER PATH 'NS3:dF1',
          df_2  NUMBER PATH 'NS3:dF2',
          df_3  NUMBER PATH 'NS3:dF3',
          df_4  NUMBER PATH 'NS3:dF4');
end;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875105
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicArtNick, "Парсить его лучше так:"

Балобол, ты уверен, что ты воспринимаем?
Если не воспринимаешь читай стандарт , источник знаний
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875167
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickМенять же документ на стоит, он такой какой есть.
Парсить его лучше так:
1. объявить ns, их 3.
3. парсить по объявленным ns
и тогда хоть NS3, NS4, NS248 -

Зачем вообще обьявлять NS namespaces если требуется (что я вначале пропустил) все items, как xtender уже намекал?

SY.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875246
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYArtNickМенять же документ на стоит, он такой какой есть.
Парсить его лучше так:
1. объявить ns, их 3.
3. парсить по объявленным ns
и тогда хоть NS3, NS4, NS248 -

Зачем вообще обьявлять NS namespaces если требуется (что я вначале пропустил) все items, как xtender уже намекал?

SY.

Таких постановок не бывает
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875290
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
по идиотизму котико-кальмарских напоминает... не оно ли?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875339
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickТаких постановок не бываетбывает.
мне самому непонятно зачем для каждого итема свой NS объявляют (хм, номер строки в отчёте на базе которого строят ответ?), но такой вот он приходит и его надо обработать.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875481
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterArtNickТаких постановок не бываетбывает.
мне самому непонятно зачем для каждого итема свой NS объявляют (хм, номер строки в отчёте на базе которого строят ответ?), но такой вот он приходит и его надо обработать.
Дружище, Нет, нет и нет, NS один на все итемы , а вот префиксы разные. При парсинге дай свой префикс этому NS, один. Его и используй. В примере с xquery уже и переименовал префиксы. Вот еще так посмотри xpath ниже:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select a.* from v,
  xmltable (XMLNAMESPACES('http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                          'http://www.test.ru/test/test/service/service1/v1' as "service",
                          'http://www.test.ru/test/test/types/type1/v1' as "type"),
            'soapenv:Envelope/soapenv:Body/service:getData/response/type:item'
           passing xmltype(v.xval)
          COLUMNS
          df_1  NUMBER PATH 'type:dF1',
          df_2  NUMBER PATH 'type:dF2',
          df_3  NUMBER PATH 'type:dF3',
          df_4  NUMBER PATH 'type:dF4') a
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875676
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick NS один на все итемы , а вот префиксы разныеда, префиксы, попутал.
за примеры ещё раз спасибо.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38984428
rainbow59
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть примерно такой XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
<ValCurs ID="R01235" DateRange1="26/05/2015" DateRange2="16/06/2015" name="Foreign Currency Market Dynamic">
<Record Date="26.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>49,8613</Value>
</Record>
<Record Date="27.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>50,3223</Value>
</Record>
<Record Date="28.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>51,0178</Value>
</Record>
<Record Date="29.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>52,2907</Value>
</Record>
<Record Date="30.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>52,9716</Value>
</Record>
<Record Date="02.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>52,8213</Value>
</Record>
<Record Date="03.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>53,4413</Value>
</Record>
<Record Date="04.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>53,0590</Value>
</Record>
<Record Date="05.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>54,9908</Value>
</Record>
<Record Date="06.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>56,2463</Value>
</Record>
<Record Date="09.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>56,0435</Value>
</Record>
<Record Date="10.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>55,9100</Value>
</Record>
<Record Date="11.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>54,8219</Value>
</Record>
<Record Date="12.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>54,5285</Value>
</Record>
<Record Date="16.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>55,2679</Value>
</Record>
</ValCurs>


При помощи которого получается динамика курса доллара с сайта http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=26/05/2015&date_req2=16/06/2015&VAL_NM_RQ=R01235
Написал такой запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT X.VAL_DATE, X.VAL_VALUE
  FROM
  (SELECT SUBSTR(HTTPURITYPE('http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='
||TO_CHAR(SYSDATE-21,'DD/MM/YYYY')||'&date_req2='||TO_CHAR(SYSDATE+1,'DD/MM/YYYY')
||'&VAL_NM_RQ=R01235').GETCLOB(),
  REGEXP_INSTR(HTTPURITYPE('http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='
||TO_CHAR(SYSDATE-21,'DD/MM/YYYY')
||'&date_req2='
||TO_CHAR(SYSDATE+1,'DD/MM/YYYY')
||'&VAL_NM_RQ=R01235').GETCLOB(),'<+',1))XML_CODE FROM DUAL)t,
  XMLTABLE('/ValCurs/Record' PASSING XMLTYPE(t.XML_CODE)
  COLUMNS 
  VAL_DATE date path 'Date',
  VAL_VALUE number path 'Value'
) X;


Результат выполнения которого:
VAL_DATE VAL_VALUE(null) 49.8613(null) 50.3223(null)51.0178(null)52.2907(null)52.8213(null) 52.9716(null) 53.059(null)53.4413(null)54.5285(null) 54.8219(null) 54.9908(null) 55.2679(null) 55.91(null) 56.0435(null)56.2463
Никак не могу понять как сделать так, чтобы дата соответствующая курсу тоже записывалась в таблицу в колонку VAL_DATE?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38984443
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rainbow59Никак не могу понять как сделать так, чтобы дата соответствующая курсу тоже записывалась в таблицу в колонку VAL_DATE?"Собака".
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38984449
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rainbow59,
declare
cd xmltype :=
xmltype('<ValCurs ID="R01235" DateRange1="26/05/2015" DateRange2="16/06/2015" name="Foreign Currency Market Dynamic">
<Record Date="26.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>49,8613</Value>
</Record>
<Record Date="27.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>50,3223</Value>
</Record>
<Record Date="28.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>51,0178</Value>
</Record>
<Record Date="29.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>52,2907</Value>
</Record>
<Record Date="30.05.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>52,9716</Value>
</Record>
<Record Date="02.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>52,8213</Value>
</Record>
<Record Date="03.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>53,4413</Value>
</Record>
<Record Date="04.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>53,0590</Value>
</Record>
<Record Date="05.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>54,9908</Value>
</Record>
<Record Date="06.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>56,2463</Value>
</Record>
<Record Date="09.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>56,0435</Value>
</Record>
<Record Date="10.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>55,9100</Value>
</Record>
<Record Date="11.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>54,8219</Value>
</Record>
<Record Date="12.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>54,5285</Value>
</Record>
<Record Date="16.06.2015" Id="R01235">
<Nominal>1</Nominal>
<Value>55,2679</Value>
</Record>
</ValCurs>');
begin
open :the_cursor for
SELECT * from
XMLTABLE('/ValCurs/Record'
PASSING cd
COLUMNS VAL_DATE varchar2 (4000) path '@Date',
VAL_VALUE number path 'Value'
) X;
end;
1. Почитай стандарт XPATH и XQUERY, ответ на твой вопрос ( path '@Date') к Oracle не относится
2. С чего это ты уверен что в твоем XML значение аттрибута VAL_DATE по формату будет соответствовать формату даты сессии? Сначала с varchar а уж после в дату.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38984457
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickС чего это ты уверен что в твоем XML значение аттрибута VAL_DATE по формату будет соответствовать формату даты сессии?А VAL_VALUE?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38984458
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicrainbow59Никак не могу понять как сделать так, чтобы дата соответствующая курсу тоже записывалась в таблицу в колонку VAL_DATE?"Собака".
О, Барин седня многословен! Вместо:
@
аж 8 символов
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38984462
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicArtNickС чего это ты уверен что в твоем XML значение аттрибута VAL_DATE по формату будет соответствовать формату даты сессии?А VAL_VALUE?
+
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001135
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят помогите... подзабылось. Есть:
Код: plsql
1.
resp:= XMLType.createXML(soap_respond); 


в нем лежим xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <Response Id="43d84cf8-e927-4178-ae14-d079fc582df4" xmlns="http://company.ru/schema">
         <MessStatus dest="Эникейгород" status="ACCEPTED"/>
      </Response>
   </soap:Body>
</soap:Envelope>


Я пытаюсь достать status вот так:
Код: plsql
1.
2.
status := resp.EXTRACT('//MessStatus/@status').getStringVal();
DBMS_OUTPUT.PUT_LINE(status);



Возвращается ошибка:
Код: plaintext
ORA-30625: запрещен вызов метода для аргумента NULL SELF

Подскажите как вывести на экран status. Спасибо.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001155
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,
в поиске забанили
Код: plsql
1.
2.
3.
 xmltable(xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/' as "s", default 'http://company.ru/schema'),
                's:Envelope/s:Body/Response/MessStatus' passing xmltype(v.xval) columns status varchar2(100) path
                '@status') a;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001157
May12,

экстракт у тебя возвращает null.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001176
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
исправь так:May12
Код: plsql
1.
status := resp.EXTRACT('*://MessStatus/@status').getStringVal();
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001178
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
.extract('//Response/MessStatus/@status','xmlns="http://company.ru/schema"')
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001179
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
блин опечатался, правильно так:xtenderисправь так:May12
Код: plsql
1.
status := resp.EXTRACT('//*:MessStatus/@status').getStringVal();
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001186
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender, ну и я тоже
Код: plsql
1.
.extract('//MessStatus/@status','xmlns="http://company.ru/schema"')
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39001338
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender, 123йй, спасибо вам огромное. Работают оба варианта. =0)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XML в Oracle9i. Примеры разборки
    #39381032
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа коллеги, подскажите, куда копать
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <PhdDataResponse
            xmlns="PHDService">
            <PhdDataResult>
                <xs:schema id="NewDataSet"
                    xmlns=""
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="phd_data" msdata:UseCurrentLocale="true">
                        <xs:complexType>
                            <xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="phd_data">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="TAGNO" type="xs:int" minOccurs="0" />
                                            <xs:element name="TAGNAME" type="xs:string" minOccurs="0" />
                                            <xs:element name="TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="START_TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="VALUE" msdata:DataType="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" type="xs:anyType" minOccurs="0" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:schema>
                <diffgr:diffgram
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
                    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                    <DocumentElement
                        xmlns="">
                        <phd_data diffgr:id="phd_data1" msdata:rowOrder="0">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:00:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">246
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data2" msdata:rowOrder="1">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:01:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">249
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data3" msdata:rowOrder="2">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:02:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">252
                            </VALUE>
                        </phd_data>
                    </DocumentElement>
                </diffgr:diffgram>
            </PhdDataResult>
        </PhdDataResponse>
    </soap:Body>
</soap:Envelope>

какой из примеров наиболее подходящий?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381079
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
набросал примерчик как тут , но префикс ему не нравится. Похоже, PHD
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
WITH v
     AS (SELECT '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <PhdDataResponse
            xmlns="PHDService">
            <PhdDataResult>
                <xs:schema id="NewDataSet"
                    xmlns=""
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="phd_data" msdata:UseCurrentLocale="true">
                        <xs:complexType>
                            <xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="phd_data">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="TAGNO" type="xs:int" minOccurs="0" />
                                            <xs:element name="TAGNAME" type="xs:string" minOccurs="0" />
                                            <xs:element name="TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="START_TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="VALUE" msdata:DataType="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" type="xs:anyType" minOccurs="0" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:schema>
                <diffgr:diffgram
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
                    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                    <DocumentElement
                        xmlns="">
                        <phd_data diffgr:id="phd_data1" msdata:rowOrder="0">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP1>2016-12-07T11:00:00+02:00</TIMESTAMP1>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">246
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data2" msdata:rowOrder="1">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP1>2016-12-07T11:01:00+02:00</TIMESTAMP1>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">249
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data3" msdata:rowOrder="2">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP1>2016-12-07T11:02:00+02:00</TIMESTAMP1>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">252
                            </VALUE>
                        </phd_data>
                    </DocumentElement>
                </diffgr:diffgram>
            </PhdDataResult>
        </PhdDataResponse>
    </soap:Body>
</soap:Envelope>'
                   AS xval
           FROM DUAL)
         SELECT a.*
           FROM v,
                XMLTABLE (
                   XMLNamespaces (
                      'http://www.w3.org/2003/05/soap-envelope/' AS "soap",
                      'http://www.w3.org/2001/XMLSchema-instance' AS "xsi",
                      'http://www.w3.org/2001/XMLSchema' AS "xsd",
                      'urn:schemas-microsoft-com:xml-msdata' AS "msdata",
                      'urn:schemas-microsoft-com:xml-diffgram-v1' AS "diffgr",
                      'PHDService' AS "PHD"),
                   '/soap:Envelope/soap:Body/PHD:PhdDataResponse/PHD:PhdDataResult/diffgr:diffgram/DocumentElement/phd_data'
                   PASSING xmltype (v.xval)
                   COLUMNS TAGNO NUMBER PATH 'type:TAGNO',
                           tagname VARCHAR2 (200) PATH 'type:tagname',
                           TIMESTAMP1 TIMESTAMP PATH 'type:TIMESTAMP1',
                           START_TIMESTAMP TIMESTAMP PATH 'type:START_TIMESTAMP',
                           VALUE NUMBER PATH 'type:value') a

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381084
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
WITH v
     AS (SELECT '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <PhdDataResponse
            xmlns="PHDService">
            <PhdDataResult>
                <xs:schema id="NewDataSet"
                    xmlns=""
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="phd_data" msdata:UseCurrentLocale="true">
                        <xs:complexType>
                            <xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="phd_data">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="TAGNO" type="xs:int" minOccurs="0" />
                                            <xs:element name="TAGNAME" type="xs:string" minOccurs="0" />
                                            <xs:element name="TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="START_TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="VALUE" msdata:DataType="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" type="xs:anyType" minOccurs="0" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:schema>
                <diffgr:diffgram
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
                    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                    <DocumentElement
                        xmlns="">
                        <phd_data diffgr:id="phd_data1" msdata:rowOrder="0">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:00:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">246
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data2" msdata:rowOrder="1">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:01:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">249
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data3" msdata:rowOrder="2">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:02:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">252
                            </VALUE>
                        </phd_data>
                    </DocumentElement>
                </diffgr:diffgram>
            </PhdDataResult>
        </PhdDataResponse>
    </soap:Body>
</soap:Envelope>'
                   AS xval
           FROM DUAL)
         SELECT a.*
           FROM v,
                XMLTABLE (
                   XMLNamespaces (
                      'http://www.w3.org/2003/05/soap-envelope/' AS "soap",
                      'http://www.w3.org/2001/XMLSchema-instance' AS "xsi",
                      'http://www.w3.org/2001/XMLSchema' AS "xsd",
                      'urn:schemas-microsoft-com:xml-msdata' AS "msdata",
                      'urn:schemas-microsoft-com:xml-diffgram-v1' AS "diffgr",
                      'PHDService' AS "PHD"),
                   --'/soap:Envelope/soap:Body/PHD:PhdDataResponse/PHD:PhdDataResult/diffgr:diffgram/DocumentElement/phd_data'
                   '//phd_data'
                   PASSING xmltype(v.xval)
                   COLUMNS TAGNO NUMBER PATH 'TAGNO',
                           tagname VARCHAR2 (200) PATH 'TAGNAME',
                           TIMESTAMP1 timestamp WITH TIME ZONE PATH 'TIMESTAMP',
                           START_TIMESTAMP timestamp WITH TIME ZONE PATH 'START_TIMESTAMP',
                           VALUE VARCHAR2(200) PATH 'VALUE') a
                           

а полный XPATH построить не получается
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381093
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде получилось
но если посоветуете как лучше, выслушаю
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
WITH v
     AS (SELECT '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <PhdDataResponse
            xmlns="PHDService">
            <PhdDataResult>
                <xs:schema id="NewDataSet"
                    xmlns=""
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="phd_data" msdata:UseCurrentLocale="true">
                        <xs:complexType>
                            <xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="phd_data">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="TAGNO" type="xs:int" minOccurs="0" />
                                            <xs:element name="TAGNAME" type="xs:string" minOccurs="0" />
                                            <xs:element name="TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="START_TIMESTAMP" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="VALUE" msdata:DataType="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" type="xs:anyType" minOccurs="0" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:schema>
                <diffgr:diffgram
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
                    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                    <DocumentElement
                        xmlns="">
                        <phd_data diffgr:id="phd_data1" msdata:rowOrder="0">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:00:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">246
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data2" msdata:rowOrder="1">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:01:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">249
                            </VALUE>
                        </phd_data>
                        <phd_data diffgr:id="phd_data3" msdata:rowOrder="2">
                            <TAGNO>3185</TAGNO>
                            <TAGNAME>Z1.3118.AM1W2</TAGNAME>
                            <TIMESTAMP>2016-12-07T11:02:00+02:00</TIMESTAMP>
                            <START_TIMESTAMP>2016-12-07T11:00:00+02:00</START_TIMESTAMP>
                            <VALUE xsi:type="xs:float"
                                xmlns:xs="http://www.w3.org/2001/XMLSchema">252
                            </VALUE>
                        </phd_data>
                    </DocumentElement>
                </diffgr:diffgram>
            </PhdDataResult>
        </PhdDataResponse>
    </soap:Body>
</soap:Envelope>'
                   AS xval
           FROM DUAL)
         SELECT a.*
           FROM v,
                XMLTABLE (
                   XMLNamespaces (
                      'http://www.w3.org/2003/05/soap-envelope' AS "soap",
                      'urn:schemas-microsoft-com:xml-diffgram-v1' AS "diffgr",
                      'PHDService' AS "PHD"),
                   '/soap:Envelope/soap:Body/PHD:PhdDataResponse/PHD:PhdDataResult/diffgr:diffgram/DocumentElement/phd_data'
                   PASSING xmltype(v.xval)
                   COLUMNS TAGNO            NUMBER                   PATH 'TAGNO',
                           tagname          VARCHAR2 (200)           PATH 'TAGNAME',
                           TIMESTAMP1       timestamp WITH TIME ZONE PATH 'TIMESTAMP',
                           START_TIMESTAMP  timestamp WITH TIME ZONE PATH 'START_TIMESTAMP',
                           VALUE            VARCHAR2(200)            PATH 'VALUE'
                           ) a
                           

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381151
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коллеги, а децимал сепаратор - точка. Как обрабатывать? Не NLS же менять

Код: plsql
1.
<VALUE xsi:type="xs:float" xmlns:xs="http://www.w3.org/2001/XMLSchema">246.1</VALUE>




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
WITH v
     AS (SELECT '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <PhdDataResponse
            xmlns="PHDService">
            <PhdDataResult>
                <xs:schema id="NewDataSet"
                    xmlns=""
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="phd_data" msdata:UseCurrentLocale="true">
                        <xs:complexType>
                            <xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="phd_data">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="TAGNO" type="xs:int" minOccurs="0" />
                                            <xs:element name="VALUE" msdata:DataType="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" type="xs:anyType" minOccurs="0" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:schema>
                <diffgr:diffgram
                    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
                    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                    <DocumentElement
                        xmlns="">
                        <phd_data diffgr:id="phd_data1" msdata:rowOrder="0">
                            <TAGNO>3185</TAGNO>
                            <VALUE xsi:type="xs:float" xmlns:xs="http://www.w3.org/2001/XMLSchema">246.1</VALUE>
                        </phd_data>
                    </DocumentElement>
                </diffgr:diffgram>
            </PhdDataResult>
        </PhdDataResponse>
    </soap:Body>
</soap:Envelope>'
                   AS xval
           FROM DUAL)
         SELECT a.*
           FROM v,
                XMLTABLE (
                   XMLNamespaces (
                      'http://www.w3.org/2003/05/soap-envelope' AS "soap",
                      'urn:schemas-microsoft-com:xml-diffgram-v1' AS "diffgr",
                      'PHDService' AS "PHD"),
                   '/soap:Envelope/soap:Body/PHD:PhdDataResponse/PHD:PhdDataResult/diffgr:diffgram/DocumentElement/phd_data'
                   PASSING xmltype(v.xval)
                   COLUMNS TAGNO            NUMBER PATH 'TAGNO',
                           VALUE            number PATH 'VALUE'
                           ) a
                           

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381156
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxколлеги, а децимал сепаратор - точка. Как обрабатывать? Не NLS же менять Том Кайт посоветовал конвертить вручную
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381171
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andreymx,

к слову с неймспейсами можно проще:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
         SELECT a.*
           FROM v,
                XMLTABLE (
                   '/*:Envelope/*:Body/*:PhdDataResponse/*:PhdDataResult/*:diffgram/DocumentElement/phd_data'
                   PASSING xmltype(v.xval)
                   COLUMNS TAGNO            NUMBER                   PATH 'TAGNO',
                           tagname          VARCHAR2 (200)           PATH 'TAGNAME',
                           TIMESTAMP1       timestamp WITH TIME ZONE PATH 'TIMESTAMP',
                           START_TIMESTAMP  timestamp WITH TIME ZONE PATH 'START_TIMESTAMP',
                           VALUE            VARCHAR2(200)            PATH 'VALUE'
                           ) a
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381186
toobject()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxколлеги, а децимал сепаратор - точка. Как обрабатывать? Не NLS же менятьрегистрируй xsd схему с типизацией элементов и мапь их на атрибуты объектного типа.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381199
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxпосоветовал конвертить вручнуюПричём всё из varchar2(4000). Чтобы бы можно было внятно сказать где и какая ошибка вместо невнятного xml parsing failed.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39381222
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandreymxпосоветовал конвертить вручнуюПричём всё из varchar2(4000). Чтобы бы можно было внятно сказать где и какая ошибка вместо невнятного xml parsing failed.да, спасибо, что-то в этом роде уже реализую
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39385085
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коллеги, попался еще такой странный xml
в <Tasks> идёт черезстрочно группы <resource> и <Task>
максимально приблизился к результату такой хренью
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
WITH v AS(
SELECT 
'<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <PerspectGoalsResponse
      xmlns="ProjinWS">
      <PerspectGoalsResult>
        <Projects
          xmlns="">
          <Project>
            <Func_direction>Управление материальными потоками</Func_direction>
            <Tasks>
              <resource>
                <ResName>Дмитрий Васильевич</ResName>
              </resource>
              <Task>
                <TaskName>Постановка</TaskName>
              </Task>
              <resource>
                <ResName>Лариса Станиславовна</ResName>
              </resource>
              <Task>
                <TaskName>Программирование</TaskName>
              </Task>
            </Tasks>
          </Project>
        </Projects>
      </PerspectGoalsResult>
    </PerspectGoalsResponse>
  </soap:Body>
</soap:Envelope>' AS xval FROM dual
)
     SELECT Ab.*, Ac.*, Func_direction
      FROM v,
        XMLTABLE (
          '//Projects'
          PASSING XMLTYPE(v.xval)
          COLUMNS
          Func_direction VARCHAR2 (200) PATH 'Project/Func_direction',
          Tasks_XML XMLTYPE PATH 'Project'
          ) A,
        XMLTABLE (
          '//resource'
          PASSING A.Tasks_XML
          COLUMNS
          ResName VARCHAR2 (200) PATH 'ResName'
          ) Ab,
        XMLTABLE (
          '//Task'
          PASSING A.Tasks_XML
          COLUMNS
          TaskName VARCHAR2 (200) PATH 'TaskName'
          ) Ac


но т.к. Ab и Ac кроссджойнятся, то понятно с каким результатомROWNUMRESNAMETASKNAMEFUNC_DIRECTION1Дмитрий ВасильевичПостановкаУправление материальными потоками2Дмитрий ВасильевичПрограммированиеУправление материальными потоками3Лариса СтаниславовнаПостановкаУправление материальными потоками4Лариса СтаниславовнаПрограммированиеУправление материальными потокамикиньтесь идейкой
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39385112
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxв <Tasks> идёт черезстрочно группы <resource> и <Task>Ноги выдернуть "автору".
andreymxкиньтесь идейкой following-sibling
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39385180
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandreymxв <Tasks> идёт черезстрочно группы <resource> и <Task>Ноги выдернуть "автору".
andreymxкиньтесь идейкой following-sibling буду щаз дёргать поставщика, чтобы разъяснил чётко идею
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39397896
Сергей Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу разобраться что я сделал не так. Возвращает пусто:

with t as
(select XMLType('<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns=" http://www.opengis.net/kml/2.2" xmlns:gx=" http://www.google.com/kml/ext/2.2" xmlns:kml=" http://www.opengis.net/kml/2.2" xmlns:atom=" http://www.w3.org/2005/Atom">
<Document>
<name>TERMINAL</name>
<open>1</open>
<Folder xmlns=" http://www.opengis.net/kml/2.2">
<name>Алматы</name>
<description><p id="region_kaz">Алматы</p></description>
<Placemark>
<name>Терминал в маг "Технодом"</name>
<description><p id="name_kaz">"Технодом" дүкеніндегі терминал </p>
<p id="adres1">пр. Абая, 44, г. Алматы, Казахстан.</p>
<p id="adres2">уг.ул. Байтурсынова, в ТД "Променад"</p>
<p id="adres1_kaz">АБай, даңғылы, 44, Алматы қ, Қазақстан</p>
<p id="adres2_kaz">Байтурсын көшесінің қиылысы "Променад" ОССО</p>
<p id="work_schedule">пн-вс: с 10:00-22:00, без перерыва</p>
<p id="work-schedule_kaz">дс-же: 10:00-22:00, үзіліссіз</p>
<p id="phone">7979</p>
<p id="dwh_id">5</p>
<p id="note1">Категория: Терминалы самообслуживания;</p>
<p id="note2">Погашение кредитов в режиме онлайн; Пополнение депозитов в режиме онлайн; Пополнение дебетной карты в режиме онлайн; Пополнение мобильных платежей; Оплата коммунальных платежей; Оплата справок (срочная/обычная); Оплата авто штрафов по г.Алматы; Онлайн заявка на получение кредита; Онлайн заявка на получение депозита.</p>
<p id="note1_kaz">Санаты: Өзіне-өзі қызмет көрсету терминалдары</p>
<p id="note2_kaz">Несиелерді онлайн режимде өтеу; Депозиттерді онлайн режимде толықтыру; Дебет картасын онлайн режимде толықтыру; Ұялы төлемдерді толықтыру; Тұрмыстық қызметтерді төлеу; Анықтамаларды төлеу (жедел / жедел емес); Алматы қ. бойынша көлік айыппұлдарын төлеу; Несие алуға онлайн өтінім; Депозит алуға онлайн өтінім.</p></description>
<LookAt>
<longitude>76.92541292977619</longitude>
<latitude>43.24003942730797</latitude>
<altitude>0</altitude>
<heading>-0.0002406642888524397</heading>
<tilt>16.2121247048951</tilt>
<range>114.7453283132917</range>
<gx:altitudeMode xmlns:gx=" http://www.google.com/kml/ext/2.2">relativeToSeaFloor</gx:altitudeMode>
</LookAt>
<styleUrl>#m_ylw-pushpin00</styleUrl>
<Point>
<coordinates>76.92527024992003,43.24004679643284,0</coordinates>
</Point>
</Placemark>
</Folder>
</Document>
</kml>') x
from dual)
select
extract(value(s), '//description//p[@id="adres1"]/@value', 'xmlns="http://www.opengis.net/kml/2.2"' ).getStringVal()
from t,
table(XMLSequence(extract(x,
'kml/Document/Folder/Placemark/description',
'xmlns="http://www.opengis.net/kml/2.2"'))) s
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #39398035
Сергей Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался. Осталось понять как добавить в запрос
--kml/Document/name
--kml/Document/Folder/name

Как это сделать понятие не имею...


with t as
(select XMLType('<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns=" http://www.opengis.net/kml/2.2" xmlns:gx=" http://www.google.com/kml/ext/2.2" xmlns:kml=" http://www.opengis.net/kml/2.2" xmlns:atom=" http://www.w3.org/2005/Atom">
<Document>
<name>TERMINAL</name>
<open>1</open>
<Folder xmlns=" http://www.opengis.net/kml/2.2">
<name>Алматы</name>
<description><p id="region_kaz">Алматы</p></description>
<Placemark>
<name>Терминал в маг "Технодом"</name>
<description><p id="name_kaz">"Технодом" дүкеніндегі терминал </p>
<p id="adres1">пр. Абая, 44, г. Алматы, Казахстан.</p>
<p id="adres2">уг.ул. Байтурсынова, в ТД "Променад"</p>
<p id="adres1_kaz">АБай, даңғылы, 44, Алматы қ, Қазақстан</p>
<p id="adres2_kaz">Байтурсын көшесінің қиылысы "Променад" ОССО</p>
<p id="work_schedule">пн-вс: с 10:00-22:00, без перерыва</p>
<p id="work-schedule_kaz">дс-же: 10:00-22:00, үзіліссіз</p>
<p id="phone">7979</p>
<p id="dwh_id">5</p>
<p id="note1">Категория: Терминалы самообслуживания;</p>
<p id="note2">Погашение кредитов в режиме онлайн; Пополнение депозитов в режиме онлайн; Пополнение дебетной карты в режиме онлайн; Пополнение мобильных платежей; Оплата коммунальных платежей; Оплата справок (срочная/обычная); Оплата авто штрафов по г.Алматы; Онлайн заявка на получение кредита; Онлайн заявка на получение депозита.</p>
<p id="note1_kaz">Санаты: Өзіне-өзі қызмет көрсету терминалдары</p>
<p id="note2_kaz">Несиелерді онлайн режимде өтеу; Депозиттерді онлайн режимде толықтыру; Дебет картасын онлайн режимде толықтыру; Ұялы төлемдерді толықтыру; Тұрмыстық қызметтерді төлеу; Анықтамаларды төлеу (жедел / жедел емес); Алматы қ. бойынша көлік айыппұлдарын төлеу; Несие алуға онлайн өтінім; Депозит алуға онлайн өтінім.</p></description>
<LookAt>
<longitude>76.92541292977619</longitude>
<latitude>43.24003942730797</latitude>
<altitude>0</altitude>
<heading>-0.0002406642888524397</heading>
<tilt>16.2121247048951</tilt>
<range>114.7453283132917</range>
<gx:altitudeMode xmlns:gx=" http://www.google.com/kml/ext/2.2">relativeToSeaFloor</gx:altitudeMode>
</LookAt>
<styleUrl>#m_ylw-pushpin00</styleUrl>
<Point>
<coordinates>76.92527024992003,43.24004679643284,0</coordinates>
</Point>
</Placemark>
</Folder>
</Document>
</kml>') x
from dual)
select value(s),
extract(value(s), '//description//p[@id="adres1"]/text()', 'xmlns="http://www.opengis.net/kml/2.2"' ).getStringVal()
from t,
table(XMLSequence(extract(x,
'kml/Document/Folder/Placemark/description',
'xmlns="http://www.opengis.net/kml/2.2"'))) s
...
Рейтинг: 0 / 0
239 сообщений из 239, показаны все 10 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]