powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение данных из тегов XML
9 сообщений из 9, страница 1 из 1
Объединение данных из тегов XML
    #35776211
rvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Есть XML следующего вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<ROWSET>
 <ROW>
   <ID> 1 </ID>
   <PRIM>Строка1_1</PRIM>
   <PRIM>Строка1_2</PRIM>
   <PRIM>Строка1_3</PRIM>
 </ROW>
 <ROW>
   <ID> 2 </ID>
   <PRIM>Строка2_1</PRIM>
   <PRIM>Строка2_2</PRIM>
   <PRIM>Строка2_25</PRIM>
 </ROW>
</ROWSET>

Нужно его разложить в таблицу:
Код: plaintext
create table tbl1 (id number, prim clob);
Делаю следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
Insert into tbl1
select ExtractValue(value(t),'/ROW/ID'),
  ExtractValue(value(t),'/ROW/PRIM[1]')||ExtractValue(value(t),'/ROW/PRIM[2]')||ExtractValue(value(t),'/ROW/PRIM[3]')
  from table(XMLSequence(Extract(xmltype('<ROWSET><ROW><ID>1</ID><PRIM>Строка1_1</PRIM><PRIM>Строка1_2</PRIM><PRIM>Строка1_3</PRIM></ROW>
 <ROW> <ID>2</ID><PRIM>Строка2_1</PRIM><PRIM>Строка2_2</PRIM> <PRIM>Строка2_25</PRIM></ROW></ROWSET>'),'ROWSET/ROW'))) t  ;
 
Т.е. мне надо объединить все примечания из XML-файла в одно поле в таблице. Проблема в том, что
количество тегов <PRIM> может быть до 50, а больше 16 конгатенаций нельзя сделать.
Может кто знает, как мне объединить все значения <PRIM>, желательно в одном запросе.
Спасибо
...
Рейтинг: 0 / 0
Объединение данных из тегов XML
    #35776258
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rvkМожет кто знает, как мне объединить все значения <PRIM>, желательно в одном запросе.
По-моему надо не делать ничего, считая элемент PRIM единственным.
Код: 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.
SQL> with xml as (
   2     select '
  3  <ROWSET>
  4   <ROW>
  5     <ID>1</ID>
  6     <PRIM>Строка1_1</PRIM>
  7     <PRIM>Строка1_2</PRIM>
  8     <PRIM>Строка1_3</PRIM>
  9   </ROW>
 10   <ROW>
 11     <ID>2</ID>
 12     <PRIM>Строка2_1</PRIM>
 13     <PRIM>Строка2_2</PRIM>
 14     <PRIM>Строка2_25</PRIM>
 15   </ROW>
 16  </ROWSET>' xml from DUAL
  17      )
  18   select extract(value(d), 'ROW/ID/text()').getNumberVal() id
  19        , extract(value(d), 'ROW/PRIM/text()').getClobVal() prim
  20   from xml t
  21       , table (XmlSequence(XmlType(t.xml).extract('ROWSET/ROW'))) d;

 ID PRIM
--- -------------------------------------------------------------------
   1  Строка1_1Строка1_2Строка1_3
   2  Строка2_1Строка2_2Строка2_25
...
Рейтинг: 0 / 0
Объединение данных из тегов XML
    #35776260
rvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
...
Рейтинг: 0 / 0
Объединение данных из тегов XML
    #35776816
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
SQL> with xml as (
   2     select '
  3  <ROWSET>
  4   <ROW>
  5     <ID>1</ID>
  6     <PRIM>'||chr( 38 )||'lt;Строка1_1</PRIM>
  7     <PRIM>'||chr( 38 )||'gt;Строка1_2</PRIM>
  8     <PRIM>'||chr( 38 )||'amp;Строка1_3</PRIM>
  9   </ROW>
 10   <ROW>
 11     <ID>2</ID>
 12     <PRIM>'||chr( 38 )||'quot;Строка2_1</PRIM>
 13     <PRIM>Строка2_2</PRIM>
 14     <PRIM>Строка2_25</PRIM>
 15   </ROW>
 16  </ROWSET>' xml
  17   ,'<?xml version="1.0"?>
 18  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 19  <xsl:template match="*">
 20  <xsl:if test="self::*[name() !=''PRIM'']">
 21    <xsl:copy>
 22     <xsl:apply-templates/>
 23     <xsl:if test="self::*[name() =''ROW'']">
 24      <PRIM_AGG>
 25       <xsl:for-each select = "PRIM">
 26          <xsl:value-of select = "./text()"/>
 27        </xsl:for-each>
 28       </PRIM_AGG>
 29     </xsl:if>
 30    </xsl:copy>
 31  </xsl:if>
 32  </xsl:template>
 33  </xsl:stylesheet>' XSL
  34   from DUAL
  35      )
  36   select
  37      ExtractValue(value(d),'ROW/ID') ID
  38      ,ExtractValue(value(d),'ROW/PRIM_AGG') PRIM
  39   from xml t
  40        ,table(
  41          XmlSequence(
  42           Extract(XMLtransform(XMLType(t.xml)
  43                               ,XMLType(t.xsl))
  44                   ,'ROWSET/ROW')
  45          )
  46        ) d
  47   ;
 
ID    PRIM
----- --------------------------------------------------------------------------------
 1      <Строка1_1>Строка1_2&Строка1_3
 2      "Строка2_1Строка2_2Строка2_25
 
...
Рейтинг: 0 / 0
Объединение данных из тегов XML
    #35776857
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZloxaНо не следует забывать что у нас строка, а значит значение может содержать спецсимволы.Но это не повод перегибать :) Достаточно и:
Код: plaintext
1.
     , dbms_xmlgen.convert(extract(value(d), 'ROW/PRIM/text()').getClobVal(),  1 ) prim
...
Рейтинг: 0 / 0
Объединение данных из тегов XML
    #35776886
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicДостаточно и
Спасибо!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Объединение данных из тегов XML
    #40059921
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
А как сделать тоже самое с помощью xmltable?
Пытаюсь так, но ошибка ERROR at line 20:
ORA-19109: RETURNING keyword expected

Код: sql
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.
 with tx as (select xmltype('<?xml version="1.0" encoding="UTF-8"?>
<ROWSET>
 <ROW>
   <ID>1</ID>
   <Line1>line1</Line1>
   <Line2>line2</Line2>
   <PRIM>Строка1_1</PRIM>
   <PRIM>Строка1_2</PRIM>
   <PRIM>Строка1_3</PRIM>
 </ROW>
 <ROW>
   <ID>2</ID>
   <Line1>line12</Line1>
   <Line2>line22</Line2>
   <PRIM>Строка2_1</PRIM>
   <PRIM>Строка2_2</PRIM>
   <PRIM>Строка2_25</PRIM>
 </ROW>
</ROWSET>') xml_file from dual)
select id,line1,line2,prim
           from  tx,xmltable ('/ROWSET/ROW'
    PASSING xml_file COLUMNS 	         
      ID	number	PATH  'ID',
      Line1	VARCHAR2(10)	PATH  'Line1',
      Line2	VARCHAR2(10)	PATH  'Line2',
      Prim clob PATH  'PRIM/string-join(ancestor-or-self::*/text(), '' '')');
...
Рейтинг: 0 / 0
Объединение данных из тегов XML
    #40059986
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новый2,
так "работает"
Код: plsql
1.
2.
3.
Prim clob PATH  'PRIM/string-join(ancestor-or-self::*/text(), " ")'); -- двойные кавычки вместо удвоенных
Prim clob PATH  q'{PRIM/string-join(ancestor-or-self::*/text(), '' '')}'); -- удвоенные одинарные, но с quted string
Prim clob PATH  'PRIM/concat(ancestor-or-self::*/text(), " ")'); -- concat с любым из перечисленных вариантов



К тому же, string-join тупо игнорирует разделитель (всегда использует пробел), concat - учитывает.
Так , оно както сильно смахивает на глюк, но лень ковыряться.

Regards

Maxim
...
Рейтинг: 0 / 0
Объединение данных из тегов XML
    #40060350
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Demenko,
Спасибо.
Путем проб - так работает с установкой разделителя
Код: sql
1.
Prim VARCHAR2(70 ) PATH    'string-join(ancestor-or-self::*/PRIM,"--")',


А если тип clob - то вообще не нужно ничего писать - само объединяется, но без разделителя
Код: sql
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 tx as (select xmltype('<?xml version="1.0" encoding="UTF-8"?>
<ROWSET>
 <ROW>
   <ID>1</ID>
   <Line1>line1</Line1>
   <Line2>line2</Line2>
   <PRIM>Строка1_1</PRIM>
   <PRIM>Строка1_2</PRIM>
   <PRIM>Строка1_3</PRIM>
 </ROW>
 <ROW>
   <ID>2</ID>
   <Line1>line12</Line1>
   <Line2>line22</Line2>
   <PRIM>Строка2_1</PRIM>
   <PRIM>Строка2_2</PRIM>
   <PRIM>Строка2_25</PRIM>
 </ROW>
  <ROW>
   <ID>3</ID>
   <Line1>line13</Line1>
   <Line2>line23</Line2>
   <PRIM>Строка3_5</PRIM>
   <PRIM>Строка3_6</PRIM>
   <PRIM>Строка3_7</PRIM>
 </ROW>
</ROWSET>') xml_file from dual)
select id,line1,line2,prim,prim2
           from  tx,xmltable ('/ROWSET/ROW'
    PASSING xml_file COLUMNS 	         
      ID	number	PATH  'ID',
      Line1	VARCHAR2(10)	PATH  'Line1',
      Line2	VARCHAR2(10)	PATH  'Line2',
      Prim VARCHAR2(70 ) PATH    'string-join(ancestor-or-self::*/PRIM,"--")',
      Prim2 clob PATH    'PRIM');

 ID LINE1      LINE2      PRIM                                               PRIM2
--- ---------- ---------- --------------------------------- ----------------------------------
  1 line1      line2      Строка1_1--Строка1_2--Строка1_3                  Строка1_1Строка1_2Строка1_3
  2 line12     line22     Строка2_1--Строка2_2--Строка2_25                 Строка2_1Строка2_2Строка2_25
  3 line13     line23     Строка3_5--Строка3_6--Строка3_7                  Строка3_5Строка3_6Строка3_7
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение данных из тегов XML
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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