Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пожалуйста, помогите с XMLTABLE / 17 сообщений из 17, страница 1 из 1
28.11.2018, 18:54
    #39740054
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с 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.
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
28.11.2018, 19:14
    #39740066
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
Код: 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
28.11.2018, 19:46
    #39740082
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с 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.
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
29.11.2018, 07:32
    #39740183
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
Спасибо, andrey_anonymous . Работает, синтаксис понятент даже тем, кто, как и я, ленится читать документацию.
Работает. Возвращает то, что и требовалось.
...
Рейтинг: 0 / 0
29.11.2018, 07:36
    #39740186
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
Спасибо, 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
29.11.2018, 07:49
    #39740189
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
И, как всегда бывает: первоначальные условия немного изменились.

Для 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
29.11.2018, 08:07
    #39740192
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
medium,

В вариант aa добавь в xpath ',/Список/Субъект[empty(./Копии/Копия)]' и в path поля ',КодСубъекта'
...
Рейтинг: 0 / 0
29.11.2018, 09:27
    #39740211
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с 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.
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
29.11.2018, 10:09
    #39740230
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
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
29.11.2018, 10:13
    #39740231
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
Спасибо 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
29.11.2018, 10:15
    #39740233
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
ORA-00600 возник, когда я на своём личном не пойми каком древнем инстансе попытался выполнить этот запрос....
На 12g он вполне себе ничего выполнился.
...
Рейтинг: 0 / 0
29.11.2018, 10:35
    #39740239
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
Уважаемый -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
29.11.2018, 10:39
    #39740243
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
-2-
У меня на 11g никакой ORA-00600 не возникало.Только ТС может на своей машине проверить запрос и сказать, работает он у него или нет. Рад, что он нашел работающий вариант.
...
Рейтинг: 0 / 0
29.11.2018, 10:43
    #39740244
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с 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.
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
29.11.2018, 10:55
    #39740250
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
mediumсоставленном по рекомендациям-2-В вариант aa добавь в xpath ',/Список/Субъект[empty(./Копии/Копия)]' и в path поля ',КодСубъекта'Большой толковый словарь ДОБАВИТЬ , -влю, -вишь; св. что (чего).
1. =Прибавить
Прибавить к уже имеющемуся, дополнить до необходимого, нужного...
...
Рейтинг: 0 / 0
29.11.2018, 11:47
    #39740279
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
-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
29.11.2018, 11:48
    #39740280
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пожалуйста, помогите с XMLTABLE
ultrasonic7 , спасибо, у меня уже получилось почти то же самое, но с LEFT JOIN
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пожалуйста, помогите с XMLTABLE / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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