Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение данных из тегов XML / 9 сообщений из 9, страница 1 из 1
25.01.2009, 18:52
    #35776211
rvk
rvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
Здравствуйте.
Есть 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
25.01.2009, 19:43
    #35776258
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
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
25.01.2009, 19:46
    #35776260
rvk
rvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
Спасибо.
...
Рейтинг: 0 / 0
26.01.2009, 10:39
    #35776816
Zloxa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
Можно, конечно, и ничего не делать.
Но не следует забывать что у нас строка, а значит значение может содержать спецсимволы.
Код: 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
26.01.2009, 10:56
    #35776857
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
ZloxaНо не следует забывать что у нас строка, а значит значение может содержать спецсимволы.Но это не повод перегибать :) Достаточно и:
Код: plaintext
1.
     , dbms_xmlgen.convert(extract(value(d), 'ROW/PRIM/text()').getClobVal(),  1 ) prim
...
Рейтинг: 0 / 0
26.01.2009, 11:07
    #35776886
Zloxa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
ElicДостаточно и
Спасибо!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.04.2021, 16:39
    #40059921
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
Добрый день.
А как сделать тоже самое с помощью 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
05.04.2021, 19:03
    #40059986
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
новый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
07.04.2021, 13:45
    #40060350
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение данных из тегов XML
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение данных из тегов XML / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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