powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пожалуйста, помогите с XMLTABLE
17 сообщений из 17, страница 1 из 1
Пожалуйста, помогите с XMLTABLE
    #39740054
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуйста, помогите.
Нужно включить в запрос еще одно поле КодСубъекта
Записей должно остаться такое же количество, как есть сейчас.

Код: 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.
WITH tbl AS
 (SELECT xmltype('<Список>
<Субъект><КодСубъекта>3</КодСубъекта>
<Копии>
<Копия><ID>1</ID><DATE>S</DATE></Копия>
<Копия><ID>2</ID><DATE>E</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>4</КодСубъекта>
<Копии>
<Копия><ID>4</ID><DATE>W</DATE></Копия>
<Копия><ID>5</ID><DATE>YYYY</DATE></Копия>
</Копии>
</Субъект>
</Список>') AS src
    FROM dual)
SELECT x.*
  FROM tbl t
      , xmltable('for $recordd in /Список/Субъект/Копии/Копия,
                  $rec_id in $recordd/ID, $dt in $recordd/DATE
                  return <record new_id="{$recordd/ID/text()}" txt="{$recordd/DATE/text()}"/>' 
                  passing t.src 
                  columns v_id NUMBER path './@new_id'
                  ,col VARCHAR2(2000) path './@txt') x



Спасибо
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740066
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT x.*
  FROM tbl t
      , xmltable('/Список/Субъект/Копии/Копия'
                  passing t.src
                  columns v_id NUMBER path 'ID'
                  ,col VARCHAR2(15) path 'DATE'
                  , "КодСубъекта"  VARCHAR2(10) path './../../КодСубъекта'
                  ) x
;
      V_ID COL             КодСубъекта
---------- --------------- -----------
         1 S               3
         2 E               3
         4 W               4
         5 YYYY            4

SQL> 
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740082
Фотография 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.
WITH tbl AS
 (SELECT xmltype('<List>
<Subject><SubjectCode>3</SubjectCode>
<Copies>
<Copy><ID>1</ID><DATE>S</DATE></Copy>
<Copy><ID>2</ID><DATE>E</DATE></Copy>
</Copies>
</Subject>
<Subject><SubjectCode>4</SubjectCode>
<Copies>
<Copy><ID>4</ID><DATE>W</DATE></Copy>
<Copy><ID>5</ID><DATE>YYYY</DATE></Copy>
</Copies>
</Subject>
</List>') AS src
    FROM dual)
SELECT y.*,x.SubjectCode
  FROM tbl t,
       xmltable('/List/Subject'
                passing t.src
                columns
                  SubjectCode number  path './SubjectCode',
                  Copies      xmltype path './Copies'
              ) x,
       xmltable('Copies/Copy'
                passing x.Copies
                  columns v_id NUMBER path './ID'
                  ,col VARCHAR2(2000) path './DATE'
              ) y
/

      V_ID COL                  SUBJECTCODE
---------- -------------------- -----------
         1 S                              3
         2 E                              3
         4 W                              4
         5 YYYY                           4

SQL> 



SY.
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740183
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, andrey_anonymous . Работает, синтаксис понятент даже тем, кто, как и я, ленится читать документацию.
Работает. Возвращает то, что и требовалось.
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740186
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, SY
При попытке выполнения скрипта возникла ошибка
Код: plsql
1.
2.
ORA-00600: код внутренней ошибки, аргументы: [kkoljt1], [], [], [], [], [], [], [], [], [], [], []
00600. 00000 -  "internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]"



Это странно, поскольку чуть уменьшенный скрипт работает адекватно:
Код: 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.
WITH tbl AS
 (SELECT xmltype('<List>
<Subject><SubjectCode>3</SubjectCode>
<Copies>
<Copy><ID>1</ID><DATE>S</DATE></Copy>
<Copy><ID>2</ID><DATE>E</DATE></Copy>
</Copies>
</Subject>
<Subject><SubjectCode>4</SubjectCode>
<Copies>
<Copy><ID>4</ID><DATE>W</DATE></Copy>
<Copy><ID>5</ID><DATE>YYYY</DATE></Copy>
</Copies>
</Subject>
</List>') AS src
    FROM dual)
SELECT /*y.*, */x.*
  FROM tbl t,
       xmltable('/List/Subject'
                passing t.src
                columns
                  SubjectCode number  path './SubjectCode',
                  Copies      xmltype path './Copies'
              ) x



Возвращает набор:
Код: plsql
1.
2.
3	<Copies><Copy><ID>1</ID><DATE>S</DATE></Copy><Copy><ID>2</ID><DATE>E</DATE></Copy></Copies>
4	<Copies><Copy><ID>4</ID><DATE>W</DATE></Copy><Copy><ID>5</ID><DATE>YYYY</DATE></Copy></Copies>



Буду разбираться.
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740189
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, как всегда бывает: первоначальные условия немного изменились.

Для XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
'<Список>
<Субъект><КодСубъекта>3</КодСубъекта>
<Копии>
<Копия><ID>1</ID><DATE>S</DATE></Копия>
<Копия><ID>2</ID><DATE>E</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>4</КодСубъекта>
<Копии>
<Копия><ID>4</ID><DATE>W</DATE></Копия>
<Копия><ID>5</ID><DATE>YYYY</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>9</КодСубъекта>
</Субъект>
</Список>'



Должны возвращаться записи:

Код: plsql
1.
2.
3.
4.
5.
6.
КодСубъекта ID    DATE
3           1     S
3           2     E
4           4     W
4           5     YYYY
9           NULL  NULL



Спасибо.
Впрочем, после того, как были продемонстрированы возможные подходы к решению, мне следует научиться делать это самому.
Но буду рад увидеть красивое решение этой, немного изменившейся задачи.
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740192
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medium,

В вариант aa добавь в xpath ',/Список/Субъект[empty(./Копии/Копия)]' и в path поля ',КодСубъекта'
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740211
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
select
  u.v_id,
  p.id_copy,
  p.date_copy
from (select xmltype('<Список>
                        <Субъект>
                          <КодСубъекта>333</КодСубъекта>
                          <Копии>
                            <Копия>
                              <ID>1</ID>
                              <DATE>S</DATE>
                            </Копия>
                            <Копия>
                              <ID>2</ID>
                              <DATE>E</DATE>
                            </Копия>
                          </Копии>
                        </Субъект>
                        <Субъект>
                          <КодСубъекта>444</КодСубъекта>
                          <Копии>
                            <Копия>
                              <ID>3</ID>
                              <DATE>W</DATE>
                            </Копия>
                            <Копия>
                              <ID>4</ID>
                              <DATE>YYYY</DATE>
                            </Копия>
                          </Копии>
                        </Субъект>
                      </Список>
                    ') xml_data from dual) x
       ,xmltable('/Список/Субъект'
                PASSING x.xml_data
                columns
                     v_id    NUMBER  path 'КодСубъекта'
                 , copies   xmltype  path 'Копии'
                ) u
       ,xmltable('/Копии/Копия'
                PASSING u.copies
                columns
                    id_copy   varchar2(20 char)  path 'ID',
                    date_copy varchar2(20 char)  path 'DATE'
                ) p 
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740230
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7ТС, попробуй еще такой вариантДостаточно самонадеянно полагать, что из-за перестановки запятых перестанет ora-600
SYultrasonic7
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...,
xmltable('/List/Subject'
      passing t.src
      columns
             SubjectCode number  path './SubjectCode',
             Copies      xmltype path './Copies'
) x,
xmltable('Copies/Copy'
      passing x.Copies
             columns v_id NUMBER path './ID'
             ,col VARCHAR2(2000) path './DATE'
) y

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
,xmltable('/Список/Субъект'
       PASSING x.xml_data
       columns
              v_id    NUMBER  path 'КодСубъекта'
          , copies   xmltype  path 'Копии'
) u
,xmltable('/Копии/Копия'
       PASSING u.copies
       columns
            id_copy   varchar2(20 char)  path 'ID',
            date_copy varchar2(20 char)  path 'DATE'
) p 
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740231
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо SY. На 12g у меня благополучно заработал следующий вариант, точно тот, который мне и нужен.

Код: 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 tbl AS
 (SELECT xmltype('<List>
<Subject><SubjectCode>3</SubjectCode>
<Copies>
<Copy><ID>1</ID><DATE>S</DATE></Copy>
<Copy><ID>2</ID><DATE>E</DATE></Copy>
</Copies>
</Subject>
<Subject><SubjectCode>4</SubjectCode>
<Copies>
<Copy><ID>4</ID><DATE>W</DATE></Copy>
<Copy><ID>5</ID><DATE>YYYY</DATE></Copy>
</Copies>
</Subject>
<Subject><SubjectCode>99</SubjectCode>
</Subject>
</List>') AS src
    FROM dual)
SELECT x.SubjectCode,y.*
  FROM tbl t join 
       xmltable('/List/Subject'
                passing t.src
                columns
                  SubjectCode number  path './SubjectCode',
                  Copies      xmltype path './Copies'
              ) x on 1=1
              left join 
       xmltable('Copies/Copy'
                passing x.Copies
                  columns v_id NUMBER path './ID'
                  ,col VARCHAR2(2000) path './DATE'
              ) y on 1=1
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740233
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA-00600 возник, когда я на своём личном не пойми каком древнем инстансе попытался выполнить этот запрос....
На 12g он вполне себе ничего выполнился.
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740239
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый -2- .
Пожалуйста, укажите где ошибка в запросе, составленном по рекомендациям:
Код: 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.
WITH tbl AS
 (SELECT xmltype('<Список>
<Субъект><КодСубъекта>3</КодСубъекта>
<Копии>
<Копия><ID>1</ID><DATE>S</DATE></Копия>
<Копия><ID>2</ID><DATE>E</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>4</КодСубъекта>
<Копии>
<Копия><ID>4</ID><DATE>W</DATE></Копия>
<Копия><ID>5</ID><DATE>YYYY</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>9</КодСубъекта>
</Субъект>
</Список>') AS src
    FROM dual)
SELECT x.*
  FROM tbl t
      , xmltable('/Список/Субъект[empty(./Копии/Копия)]'
                  passing t.src
                  columns v_id NUMBER path 'ID'
                  ,col VARCHAR2(15) path 'DATE'
                  , "КодСубъекта"  VARCHAR2(10) path './../../КодСубъекта'
                  ) x
;



Запрос возвращает одну пустую строку.
А хотелось бы:
Код: plsql
1.
2.
3.
4.
5.
1 3 1 S
2 3 2 E
3 4 4 W
4 4 5 YYYY
5 99    
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740243
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-
У меня на 11g никакой ORA-00600 не возникало.Только ТС может на своей машине проверить запрос и сказать, работает он у него или нет. Рад, что он нашел работающий вариант.
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740244
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.
30.
31.
32.
33.
select
  u.v_id,
  p.id_copy,
  p.date_copy
from (select xmltype('<Список>
<Субъект><КодСубъекта>3</КодСубъекта>
<Копии>
<Копия><ID>1</ID><DATE>S</DATE></Копия>
<Копия><ID>2</ID><DATE>E</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>4</КодСубъекта>
<Копии>
<Копия><ID>4</ID><DATE>W</DATE></Копия>
<Копия><ID>5</ID><DATE>YYYY</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>9</КодСубъекта>
</Субъект>
</Список>
                    ') xml_data from dual) x
       ,xmltable('/Список/Субъект'
                PASSING x.xml_data
                columns
                     v_id    NUMBER  path 'КодСубъекта'
                 , copies   xmltype  path 'Копии'
                ) u
       ,xmltable('/Копии/Копия'
                PASSING u.copies
                columns
                    id_copy   varchar2(20 char)  path 'ID',
                    date_copy varchar2(20 char)  path 'DATE'
                ) p 



...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740250
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mediumсоставленном по рекомендациям-2-В вариант aa добавь в xpath ',/Список/Субъект[empty(./Копии/Копия)]' и в path поля ',КодСубъекта'Большой толковый словарь ДОБАВИТЬ , -влю, -вишь; св. что (чего).
1. =Прибавить
Прибавить к уже имеющемуся, дополнить до необходимого, нужного...
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740279
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2- Большое спасибо. действительно, в рекомендации каждое слово на своем месте. И по-русски.
Результат:
Код: 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.
WITH tbl AS
 (SELECT xmltype('<Список>
<Субъект><КодСубъекта>3</КодСубъекта>
<Копии>
<Копия><ID>1</ID><DATE>S</DATE></Копия>
<Копия><ID>2</ID><DATE>E</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>4</КодСубъекта>
<Копии>
<Копия><ID>4</ID><DATE>W</DATE></Копия>
<Копия><ID>5</ID><DATE>YYYY</DATE></Копия>
</Копии>
</Субъект>
<Субъект><КодСубъекта>8</КодСубъекта>
</Субъект>
</Список>') AS src
    FROM dual)

SELECT x.*
  FROM tbl t
      , xmltable('/Список/Субъект/Копии/Копия,/Список/Субъект[empty(./Копии/Копия)]'
                  passing t.src
                  columns v_id NUMBER path 'ID'
                  ,col VARCHAR2(15) path 'DATE'
                  , "КодСубъекта"  VARCHAR2(10) path './../../КодСубъекта,КодСубъекта'
                  ) x
;
...
Рейтинг: 0 / 0
Пожалуйста, помогите с XMLTABLE
    #39740280
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7 , спасибо, у меня уже получилось почти то же самое, но с LEFT JOIN
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пожалуйста, помогите с XMLTABLE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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