Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00933 при парсинге XML / 25 сообщений из 39, страница 1 из 2
30.11.2017, 09:44
    #39561757
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Здравствуйте! Суть в следующем: из таблицы schema1.table1 я вытаскиваю переменную типа CLOB в CLOB_DATA, затем привожу её к типу XMLTYPE и называю XML_DATA. Затем мне нужно вытащить внутренний элемент 'tagFirstInnerXML' как XML и назвать его INNER_XML. Формат XML-ки имеет следующую структуру:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<tagMain>
<tagFirstInnerXML>
<firstInner value="FirstInner 1"/>
<tagSecondInnerXML>
<secondInner value="SecondInner 11"/>
</tagSecondInnerXML>
<tagSecondInnerXML>
<secondInner value="SecondInner 12"/>
</tagSecondInnerXML>
</tagFirstInnerXML>
</tagMain>


Как можно видеть, элемент tagSecondInnerXML вложен в элемент tagFirstInnerXML, а он, в свою очередь, в tagMain.
Для разбора написан код следующего содержания:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH CLOB_DATA AS
(
select field_res 
from schema1.table1 
where request like '%getInvoice%' 
and doc_id = 999999999
),
XML_DATA AS
(
select XMLTYPE(field_res) from CLOB_DATA
)
select * from XML_TABLE('tagMain' 
                        PASSING XML_DATA
                        INNER_XML XMLTYPE PATH 'tagFirstInnerXML'); 



Но при попытке его выполнить возникает ошибка:
авторORA-00933: неверное завершение SQL-предложения
Подскажите, как правильно переписать код, чтобы получить на выходе внутреннюю XML-ку tagFirstInnerXML ?
...
Рейтинг: 0 / 0
30.11.2017, 09:50
    #39561759
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Считаю необходимым пояснить, для чего это нужно. Вообще, моя xml-ка может внутри элемента tagMain содержать какое угодно количество элементов tagFirstInnerXML. А они, в свою очередь, внутри себя могут содержать какое угодно количество элементов tagSecondInnerXML. Например, xml-ка может иметь вид:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<tagMain>
<tagFirstInnerXML>
<firstInner value="FirstInner 1"/>
<tagSecondInnerXML>
<secondInner value="SecondInner 11"/>
</tagSecondInnerXML>
<tagSecondInnerXML>
<secondInner value="SecondInner 12"/>
</tagSecondInnerXML>
</tagFirstInnerXML>
<tagFirstInnerXML>
<firstInner value="FirstInner 2"/>
<tagSecondInnerXML>
<secondInner value="SecondInner 21"/>
</tagSecondInnerXML>
<tagSecondInnerXML>
<secondInner value="SecondInner 22"/>
</tagSecondInnerXML>
</tagFirstInnerXML>
</tagMain>
...
Рейтинг: 0 / 0
30.11.2017, 09:51
    #39561760
ORA-00933 при парсинге XML
ultrasonic7как правильно переписать кодНачни с изучения синтаксиса ораклового sql.
...
Рейтинг: 0 / 0
30.11.2017, 09:53
    #39561761
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Мне нужно функцией XMLTABLE распарсить сначала внешние элементы tagFirstInnerXML, а затем внутренние элементы tagSecondInnerXML. Потом я хочу получить декартово произведение получившихся таблиц.
...
Рейтинг: 0 / 0
30.11.2017, 09:55
    #39561763
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ыйд куаукутсу
А более дельные советы будут?
...
Рейтинг: 0 / 0
30.11.2017, 09:55
    #39561765
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ultrasonic7Считаю необходимым пояснить, для чего это нужно
Считаю необходимым предложить прочитать документацию , чтобы не задавать идиотских вопросов, почему полностью кривой код не работает.
Код: plsql
1.
2.
3.
select * from XML_TABLE('tagMain' 
                        PASSING XML_DATA
                        INNER_XML XMLTYPE PATH 'tagFirstInnerXML'); 


Лермонтов М.Ю.Смешались в кучу кони, люди и залпы тысячи орудий
...
Рейтинг: 0 / 0
30.11.2017, 10:07
    #39561771
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
env, спасибо за лестный отзыв, но всё-таки что не так?
...
Рейтинг: 0 / 0
30.11.2017, 10:07
    #39561772
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Доку я читал
...
Рейтинг: 0 / 0
30.11.2017, 10:10
    #39561775
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Функцию XMLTABLE применял много раз, но в процедурах PL/SQL. Теперь мне надо написать полностью SQL-ный запрос и на выходе получить таблицу
...
Рейтинг: 0 / 0
30.11.2017, 10:17
    #39561779
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Да, я не совсем правильно написал. Надо было копипастом из своего кода, документацию месяц назад читал, немного подзабыл). Теперь выглядит вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH CLOB_DATA AS
(
select field_res 
from schema1.table1 
where request like '%getInvoice%' 
and doc_id = 999999999
),
XML_DATA AS
(
select XMLTYPE(field_res) from CLOB_DATA
)
select * from XMLTABLE('tagMain' 
                        PASSING XML_DATA
                        COLUMNS INNER_XML XMLTYPE PATH 'tagFirstInnerXML'); 
...
Рейтинг: 0 / 0
30.11.2017, 10:33
    #39561790
ORA-00933 при парсинге XML
ultrasonic7документацию месяц назад читалМолодец! Осталось перечитать про passing. Будем с нетерпением ждать следующих твоих синтаксических успехов.
...
Рейтинг: 0 / 0
30.11.2017, 10:40
    #39561794
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Осталась одна проблема. Несмотря на то, что после выполнения второго запроса получается только одна запись с одним полем, она рассматривается Ораклом как табличный результат. А конструкция PASSING ждет XMLTYPE. Сейчас появляется ошибка ORA-00904 (неправильное имя колонки/недопустимый идентификатор). Может кто-то без комментариев к качеству кода подсказать, как правильно передать параметр в конструкцию PASSING ?
...
Рейтинг: 0 / 0
30.11.2017, 10:45
    #39561797
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ultrasonic7Может кто-то без комментариев к качеству кода подсказать
stfw FLOWR 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.
set long 10000
with t as (
  select xmltype('<MainGott>
<someFirstChild>
<firstChild value="FirstChild 1"/>
<someSecondChild>
<secondChild value="secondChild 11"/>
</someSecondChild>
<someSecondChild>
<secondChild value="secondChild 12"/>
</someSecondChild>
</someFirstChild>
<someFirstChild>
<firstChild value="FirstChild 2"/>
<someSecondChild>
<secondChild value="secondChild 21"/>
</someSecondChild>
<someSecondChild>
<secondChild value="secondChild 22"/>
</someSecondChild>
</someFirstChild>
</MainGott>') x
from dual)
select t.*, y.*
from t
     ,xmltable('for $i in MainGott/someFirstChild let $sec := $i/someSecondChild
                  for $j in $sec
                    return <root>{$i/firstChild}{$j/secondChild}</root>' passing t.x
                columns value2  varchar2(1000) path '/root/secondChild/@value', 
                        value1 varchar2(1000) path '/root/firstChild/@value') y
...
Рейтинг: 0 / 0
30.11.2017, 10:55
    #39561802
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Если игнорировать рекламу, то неплохой для понимания мануал по FLOWR есть тут
...
Рейтинг: 0 / 0
30.11.2017, 11:04
    #39561811
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
На первый взгляд, довольно мощный язык. Сорри за глупый вопрос, а без FLWOR документ с двумя дочерними элементами разобрать не получится? Или без него в наше время никуда?
...
Рейтинг: 0 / 0
30.11.2017, 11:29
    #39561829
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ultrasonic7,

Последовательно применяя xmltable/xmlquery например.
...
Рейтинг: 0 / 0
30.11.2017, 11:41
    #39561844
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ultrasonic7,
что-то типа такого

Код: 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.
with t as (
  select xmltype('<MainGott>
<someFirstChild>
<firstChild value="FirstChild 1"/>
<someSecondChild>
<secondChild value="secondChild 11"/>
</someSecondChild>
<someSecondChild>
<secondChild value="secondChild 12"/>
</someSecondChild>
</someFirstChild>
<someFirstChild>
<firstChild value="FirstChild 2"/>
<someSecondChild>
<secondChild value="secondChild 21"/>
</someSecondChild>
<someSecondChild>
<secondChild value="secondChild 22"/>
</someSecondChild>
</someFirstChild>
</MainGott>') x
from dual)
select y.value1, z.value2
from t
     ,xmltable('MainGott/someFirstChild' passing t.x
                columns xml1   xmltype        path '.', 
                        value1 varchar2(1000) path 'firstChild/@value') y,
      xmltable('someFirstChild/someSecondChild' passing y.xml1
                columns value2 varchar2(1000) path 'secondChild/@value') z
...
Рейтинг: 0 / 0
30.11.2017, 11:57
    #39561860
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
envПоследовательно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select value1, value2
from t
   , xmltable
     ( 'MainGott/someFirstChild/someSecondChild' passing t.x
       columns 
         value1 varchar2(100) path './../firstChild/@value'
       , value2 varchar2(100) path 'secondChild/@value'
      )
;

11g
...
Рейтинг: 0 / 0
30.11.2017, 12:32
    #39561881
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Elic,

Чёт я перемудрил
...
Рейтинг: 0 / 0
30.11.2017, 13:51
    #39561922
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
Оба варианта великолепны. Но на выходе получается таблица, где у каждого someFirstChild выводятся только его дочерние элементы. То есть так:
Value1Value2FirstChild 1secondChild 11FirstChild 1secondChild 12FirstChild 2secondChild 21FirstChild 2secondChild 22

А мне нужно, чтобы каждое someFirstChild сопоставлялось с каждым someSecondChild. Как-то так:
Value1Value2FirstChild 1secondChild 11FirstChild 1secondChild 12FirstChild 1secondChild 21FirstChild 1secondChild 22FirstChild 2secondChild 11FirstChild 2secondChild 12FirstChild 2secondChild 21FirstChild 2secondChild 22
...
Рейтинг: 0 / 0
30.11.2017, 13:57
    #39561927
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ultrasonic7А мне нужно, чтобы каждое someFirstChild сопоставлялось с каждым someSecondChild.Дичь. Вариант env-а легко преобразуется в cross-join.
...
Рейтинг: 0 / 0
30.11.2017, 14:01
    #39561933
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ultrasonic7А мне нужно, чтобы каждое someFirstChild сопоставлялось с каждым someSecondChild. Как-то так:
Value1Value2FirstChild 1secondChild 11FirstChild 1secondChild 12FirstChild 1secondChild 21FirstChild 1secondChild 22FirstChild 2secondChild 11FirstChild 2secondChild 12FirstChild 2secondChild 21FirstChild 2secondChild 22

xml тут не при чем, объедини множества и получишь то что хочешь.
...
Рейтинг: 0 / 0
30.11.2017, 14:11
    #39561943
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ultrasonic7,

FLOWR

Код: 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.
with t as (
  select xmltype('<MainGott>
<someFirstChild>
<firstChild value="FirstChild 1"/>
<someSecondChild>
<secondChild value="secondChild 11"/>
</someSecondChild>
<someSecondChild>
<secondChild value="secondChild 12"/>
</someSecondChild>
</someFirstChild>
<someFirstChild>
<firstChild value="FirstChild 2"/>
<someSecondChild>
<secondChild value="secondChild 21"/>
</someSecondChild>
<someSecondChild>
<secondChild value="secondChild 22"/>
</someSecondChild>
</someFirstChild>
</MainGott>') x
from dual)
select y.*
from t
     ,xmltable('let $i := MainGott/someFirstChild
                let $j := MainGott/someFirstChild/someSecondChild
                for $ii in $i 
                  for $jj in $j
                    return <root>{$ii/firstChild}{$jj/secondChild}</root>' passing t.x
                columns 
                        fc     varchar2(100)  path 'firstChild/@value',
                        sc     varchar2(100)  path 'secondChild/@value') y
...
Рейтинг: 0 / 0
30.11.2017, 14:17
    #39561949
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ElicenvПоследовательно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select value1, value2
from t
   , xmltable
     ( 'MainGott/someFirstChild/someSecondChild' passing t.x
       columns 
         value1 varchar2(100) path './../firstChild/@value'
       , value2 varchar2(100) path 'secondChild/@value'
      )
;

11g


Проблемы по версиям:
value1value2 secondChild 11 secondChild 12 secondChild 21 secondChild 22
...
Рейтинг: 0 / 0
30.11.2017, 14:25
    #39561956
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00933 при парсинге XML
ElicenvПоследовательно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select value1, value2
from t
   , xmltable
     ( 'MainGott/someFirstChild/someSecondChild' passing t.x
       columns 
         value1 varchar2(100) path './../firstChild/@value'
       , value2 varchar2(100) path 'secondChild/@value'
      )
;

11g

Проблема с хождением назад, например на Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production

value1 value2NULL secondChild 11NULL secondChild 12NULL secondChild 21NULL secondChild 22

Вангую что ни твой вариант ни ENV не подойдут так как ТС писал что
А они, в свою очередь, внутри себя могут содержать какое угодно количество элементов tagSecondInnerXML
Какое угодно количество это в том числе и ноль, minOccurs = 0 maxOccurs= unbounded
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00933 при парсинге XML / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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