powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00933 при парсинге XML
25 сообщений из 39, страница 1 из 2
ORA-00933 при парсинге XML
    #39561757
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Суть в следующем: из таблицы 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
ORA-00933 при парсинге XML
    #39561759
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Считаю необходимым пояснить, для чего это нужно. Вообще, моя 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
ORA-00933 при парсинге XML
    #39561760
ultrasonic7как правильно переписать кодНачни с изучения синтаксиса ораклового sql.
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561761
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно функцией XMLTABLE распарсить сначала внешние элементы tagFirstInnerXML, а затем внутренние элементы tagSecondInnerXML. Потом я хочу получить декартово произведение получившихся таблиц.
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561763
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ыйд куаукутсу
А более дельные советы будут?
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561765
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7Считаю необходимым пояснить, для чего это нужно
Считаю необходимым предложить прочитать документацию , чтобы не задавать идиотских вопросов, почему полностью кривой код не работает.
Код: plsql
1.
2.
3.
select * from XML_TABLE('tagMain' 
                        PASSING XML_DATA
                        INNER_XML XMLTYPE PATH 'tagFirstInnerXML'); 


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

Код: 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
ORA-00933 при парсинге XML
    #39561790
ultrasonic7документацию месяц назад читалМолодец! Осталось перечитать про passing. Будем с нетерпением ждать следующих твоих синтаксических успехов.
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561794
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Осталась одна проблема. Несмотря на то, что после выполнения второго запроса получается только одна запись с одним полем, она рассматривается Ораклом как табличный результат. А конструкция PASSING ждет XMLTYPE. Сейчас появляется ошибка ORA-00904 (неправильное имя колонки/недопустимый идентификатор). Может кто-то без комментариев к качеству кода подсказать, как правильно передать параметр в конструкцию PASSING ?
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561797
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ORA-00933 при парсинге XML
    #39561802
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если игнорировать рекламу, то неплохой для понимания мануал по FLOWR есть тут
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561811
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На первый взгляд, довольно мощный язык. Сорри за глупый вопрос, а без FLWOR документ с двумя дочерними элементами разобрать не получится? Или без него в наше время никуда?
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561829
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

Последовательно применяя xmltable/xmlquery например.
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561844
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ORA-00933 при парсинге XML
    #39561860
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ORA-00933 при парсинге XML
    #39561881
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Чёт я перемудрил
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561922
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оба варианта великолепны. Но на выходе получается таблица, где у каждого 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
ORA-00933 при парсинге XML
    #39561927
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7А мне нужно, чтобы каждое someFirstChild сопоставлялось с каждым someSecondChild.Дичь. Вариант env-а легко преобразуется в cross-join.
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561933
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7А мне нужно, чтобы каждое someFirstChild сопоставлялось с каждым someSecondChild. Как-то так:
Value1Value2FirstChild 1secondChild 11FirstChild 1secondChild 12FirstChild 1secondChild 21FirstChild 1secondChild 22FirstChild 2secondChild 11FirstChild 2secondChild 12FirstChild 2secondChild 21FirstChild 2secondChild 22

xml тут не при чем, объедини множества и получишь то что хочешь.
...
Рейтинг: 0 / 0
ORA-00933 при парсинге XML
    #39561943
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ORA-00933 при парсинге XML
    #39561949
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ORA-00933 при парсинге XML
    #39561956
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 39, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00933 при парсинге XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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