Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непонятки с XMLTYPE и XMLTransform / 16 сообщений из 16, страница 1 из 1
25.01.2011, 11:29
    #37077031
lLocust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
Господа, помогите, совсем запутался.

Есть исходные данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
WITH ORGANIZATION AS (  SELECT  1  ORG_ID, 'Коровье вымя' ORG_NAME FROM dual UNION ALL
                        SELECT  2  ORG_ID, 'Бычье счастье' ORG_NAME FROM dual 
), ORG_ADDRESS    AS (  SELECT  1  ORG_ID, 'Женское поле №1' ADDRESS FROM dual UNION ALL
                        SELECT  1  ORG_ID, 'Женское поле №2' ADDRESS FROM dual UNION ALL
                        SELECT  2  ORG_ID, 'Мужское поле №15' ORG_NAME FROM dual UNION ALL 
                        SELECT  2  ORG_ID, 'Мужское поле №17' ORG_NAME FROM dual
)

в результате требуется результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <ORG_ID> 1 </ORG_ID>
  <ORG_NAME>Коровье вымя</ORG_NAME>
  <ADR>
    <ADDRESS>Женское поле № 1 </ADDRESS>
  </ADR>
  <ADR>
    <ADDRESS>Женское поле № 2 </ADDRESS>
  </ADR>
 </ROW>
 <ROW>
  <ORG_ID> 2 </ORG_ID>
  <ORG_NAME>Бычье счастье</ORG_NAME>
  <ADR>
    <ADDRESS>Мужское поле № 15 </ADDRESS>
  </ADR>
  <ADR>
    <ADDRESS>Мужское поле № 17 </ADDRESS>
  </ADR>
 </ROW>
</ROWSET>
Что бы внутри тегов ROW организации было энное количество тегов ADR адресов.

Если в лоб:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT  XMLTYPE(cursor( 
                        SELECT  *
                        FROM    ORGANIZATION ORG,
                                ORG_ADDRESS ADR
                        WHERE   ADR.ORG_ID = ORG.ORG_ID
                        ))
FROM dual
то все понятно:
Код: 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.
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <ORG_ID> 1 </ORG_ID>
  <ORG_NAME>Коровье вымя</ORG_NAME>
  <ORG_ID> 1 </ORG_ID>
  <ADDRESS>Женское поле № 1 </ADDRESS>
 </ROW>
 <ROW>
  <ORG_ID> 1 </ORG_ID>
  <ORG_NAME>Коровье вымя</ORG_NAME>
  <ORG_ID> 1 </ORG_ID>
  <ADDRESS>Женское поле № 2 </ADDRESS>
 </ROW>
 <ROW>
  <ORG_ID> 2 </ORG_ID>
  <ORG_NAME>Бычье счастье</ORG_NAME>
  <ORG_ID> 2 </ORG_ID>
  <ADDRESS>Мужское поле № 15 </ADDRESS>
 </ROW>
 <ROW>
  <ORG_ID> 2 </ORG_ID>
  <ORG_NAME>Бычье счастье</ORG_NAME>
  <ORG_ID> 2 </ORG_ID>
  <ADDRESS>Мужское поле № 17 </ADDRESS>
 </ROW>
</ROWSET>
Строчка запроса - запись.


Тогда логичное решение - подзапрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT  XMLTYPE(cursor( 
                        SELECT  ORG.*,
                                    XMLTYPE(cursor(   SELECT  ADR.ADDRESS
                                        FROM    ORG_ADDRESS ADR
                                        WHERE   ADR.ORG_ID = ORG.ORG_ID))
                                    as adr                                    
                        FROM    ORGANIZATION ORG
                        ))
FROM dual
результат:
Код: 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.
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <ORG_ID> 1 </ORG_ID>
  <ORG_NAME>Коровье вымя</ORG_NAME>
  <ADR>
   <ROWSET>
  <ROW>
    <ADDRESS>Женское поле № 1 </ADDRESS>
  </ROW>
  <ROW>
    <ADDRESS>Женское поле № 2 </ADDRESS>
  </ROW>
</ROWSET>
  </ADR>
 </ROW>
 <ROW>
  <ORG_ID> 2 </ORG_ID>
  <ORG_NAME>Бычье счастье</ORG_NAME>
  <ADR>
   <ROWSET>
  <ROW>
    <ADDRESS>Мужское поле № 15 </ADDRESS>
  </ROW>
  <ROW>
    <ADDRESS>Мужское поле № 17 </ADDRESS>
  </ROW>
</ROWSET>
  </ADR>
 </ROW>
</ROWSET>
Но опять не совсем то, т.к. теги ADDRESS находятся внутри ROW, ROWSET и ADR, от которых хотелось бы избавиться.


Попробуем преобразовать под формат подзапрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
                        SELECT  ORG.*,
                                XMLTransform(
                                    XMLTYPE(cursor(   SELECT  ADR.ADDRESS
                                        FROM    ORG_ADDRESS ADR
                                        WHERE   ADR.ORG_ID = ORG.ORG_ID))
                                    ,XMLType(
                                   '<?xml version="1.0" encoding="UTF-8"?>
                                    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                                    <xsl:output indent="yes"/>
                                    <xsl:template match="/">
                                    <xsl:for-each select="ROWSET/ROW">
                                        <ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
                                    </xsl:for-each>
                                    </xsl:template>
                                    </xsl:stylesheet>')).getClobVal()                                    
                                    as adr                                    
                        FROM    ORGANIZATION ORG
результат

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    ORG_ID ORG_NAME     
---------- -------------
ADR                                                                             
--------------------------------------------------------------------------------
          1  Коровье вымя 
<?xml version="1.0" encoding="utf-8"?>                                          
                                                                                
<ADDRESS>Женское поле № 1 </ADDRESS>                                              
<ADDRESS>Женское поле № 2 </ADDRESS>                                              
                                                                                
          2  Бычье счастье
<?xml version="1.0" encoding="utf-8"?>                                          
                                                                                
<ADDRESS>Мужское поле № 15 </ADDRESS>                                             
<ADDRESS>Мужское поле № 17 </ADDRESS>                                             
                                                                                

 2  rows selected.


Уже хорошо, но теперь все это надо обернуть в один документ:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT  XMLTYPE(cursor( 
                        SELECT  ORG.*,
                                XMLTransform(
                                    XMLTYPE(cursor(   SELECT  ADR.ADDRESS
                                        FROM    ORG_ADDRESS ADR
                                        WHERE   ADR.ORG_ID = ORG.ORG_ID))
                                    ,XMLType(
                                   '<?xml version="1.0" encoding="UTF-8"?>
                                    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                                    <xsl:output indent="yes"/>
                                    <xsl:template match="/">
                                    <xsl:for-each select="ROWSET/ROW">
                                        <ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
                                    </xsl:for-each>
                                    </xsl:template>
                                    </xsl:stylesheet>'))                                    
                                    as adr                                    
                        FROM    ORGANIZATION ORG
                        ))
FROM dual
дает ошибку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ORA- 19202 : Возникла ошибка при обработке XML 
ORA- 31011 : сбой разбора XML
ORA- 19202 : Возникла ошибка при обработке XML 
LPX- 00209 : начинающиеся с 'XML' имена PI являются зарезервированными
Error at line  1 
ORA- 06512 : на  "SYS.XMLTYPE", line  343 
ORA- 06512 : на  line  1 
Вариации пробовал разные...


Направьте в нужном направлении.
...
Рейтинг: 0 / 0
25.01.2011, 11:35
    #37077051
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
Может тогда проще создать XML самостоятельно, через XmlElement?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25.01.2011, 11:36
    #37077058
vie
vie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
lLocustУже хорошо, но теперь все это надо обернуть в один документ:
+
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT  XMLTYPE(cursor( 
                        SELECT  ORG.*,
                                XMLTransform(
                                    XMLTYPE(cursor(   SELECT  ADR.ADDRESS
                                        FROM    ORG_ADDRESS ADR
                                        WHERE   ADR.ORG_ID = ORG.ORG_ID))
                                    ,XMLType(
                                   '<?xml version="1.0" encoding="UTF-8"?>
                                    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                                    <xsl:output indent="yes"/>
                                    <xsl:template match="/">
                                    <xsl:for-each select="ROWSET/ROW">
                                        <ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
                                    </xsl:for-each>
                                    </xsl:template>
                                    </xsl:stylesheet>'))                                    
                                    as adr                                    
                        FROM    ORGANIZATION ORG
                        ))
FROM dual
дает ошибку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ORA- 19202 : Возникла ошибка при обработке XML 
ORA- 31011 : сбой разбора XML
ORA- 19202 : Возникла ошибка при обработке XML 
LPX- 00209 : начинающиеся с 'XML' имена PI являются зарезервированными
Error at line  1 
ORA- 06512 : на  "SYS.XMLTYPE", line  343 
ORA- 06512 : на  line  1 
Вариации пробовал разные...


Направьте в нужном направлении.


http://www.sql.ru/forum/actualthread.aspx?tid=596208&hl=clob+%f4%e0%e9%eb
...
Рейтинг: 0 / 0
25.01.2011, 11:56
    #37077134
lLocust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
vie,

нет, пробела в начале там нет (да и без XMLTransform работает):
Код: plaintext
1.
2.
3.
4.
5.
SELECT  ORG.*,
            XMLTYPE(cursor(   SELECT  ADR.ADDRESS
                FROM    ORG_ADDRESS ADR
                WHERE   ADR.ORG_ID = ORG.ORG_ID)).GetStringVal()
            as adr                                    
FROM    ORGANIZATION ORG

Код: 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.
    ORG_ID ORG_NAME     
---------- -------------
ADR                                                                             
--------------------------------------------------------------------------------
          1  Коровье вымя 
<?xml version="1.0"?>                                                           
<ROWSET>                                                                        
 <ROW>                                                                          
  <ADDRESS>Женское поле № 1 </ADDRESS>                                            
 </ROW>                                                                         
 <ROW>                                                                          
  <ADDRESS>Женское поле № 2 </ADDRESS>                                            
 </ROW>                                                                         
</ROWSET>                                                                       
                                                                                
          2  Бычье счастье
<?xml version="1.0"?>                                                           
<ROWSET>                                                                        
 <ROW>                                                                          
  <ADDRESS>Мужское поле № 15 </ADDRESS>                                           
 </ROW>                                                                         
 <ROW>                                                                          
  <ADDRESS>Мужское поле № 17 </ADDRESS>                                           

    ORG_ID ORG_NAME     
---------- -------------
ADR                                                                             
--------------------------------------------------------------------------------
 </ROW>                                                                         
</ROWSET>                                                                       
                                                                                
 2  rows selected.

Denis Popov, можно.
Но интересно как еще можно сделать.
...
Рейтинг: 0 / 0
25.01.2011, 11:57
    #37077136
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
...
Рейтинг: 0 / 0
25.01.2011, 12:14
    #37077201
lLocust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
-2-,

за формат спасибо..., а пока сделал так:

Код: 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.
SELECT  
        XMLTransform(
            XMLTYPE(cursor( 
                            SELECT  ORG.*,
                                        cursor(   SELECT  ADR.ADDRESS
                                            FROM    ORG_ADDRESS ADR
                                            WHERE   ADR.ORG_ID = ORG.ORG_ID) AS ADR
                            FROM    ORGANIZATION ORG
                                                    )),
            XMLType('<?xml version="1.0" encoding="UTF-8"?>
                     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                     <xsl:output indent="yes"/>
                     <xsl:template match="/">
                     <xsl:for-each select="ROWSET/ROW">
                     <ORG>
                         <ORG_ID><xsl:value-of select="ORG_ID"/></ORG_ID>
                         <ORG_NAME><xsl:value-of select="ORG_NAME"/></ORG_NAME>
                         <xsl:for-each select="ADR/ADR_ROW">
                             <ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
                         </xsl:for-each>
                     </ORG>                         
                     </xsl:for-each>
                     </xsl:template>
                     </xsl:stylesheet>')).getClobVal()                                                
FROM dual

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="utf-8"?>

<ORG>
 <ORG_ID> 1 </ORG_ID>
 <ORG_NAME>Коровье вымя</ORG_NAME>
 <ADDRESS>Женское поле № 1 </ADDRESS>
 <ADDRESS>Женское поле № 2 </ADDRESS>
</ORG>
<ORG>
 <ORG_ID> 2 </ORG_ID>
 <ORG_NAME>Бычье счастье</ORG_NAME>
 <ADDRESS>Мужское поле № 15 </ADDRESS>
 <ADDRESS>Мужское поле № 17 </ADDRESS>
</ORG>

Непонятно только, если убрать ".getClobVal()", то вылезает ошибка

Код: plaintext
1.
2.
3.
4.
ORA- 31011 : сбой разбора XML
ORA- 19202 : Возникла ошибка при обработке XML 
LPX- 00209 : начинающиеся с 'XML' имена PI являются зарезервированными
Error at line  1 
...
Рейтинг: 0 / 0
25.01.2011, 12:56
    #37077312
lLocust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
lLocust,

и с этим разобрался. Если есть какие-то ошибки разбора, то они выводятся в виде одной ошибки )). У меня была другая кодировка и не было общего тега.
так работает:
Код: 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.
SELECT  
        XMLTransform(
            XMLTYPE(cursor( 
                            SELECT  ORG.*,
                                        cursor(   SELECT  ADR.ADDRESS
                                            FROM    ORG_ADDRESS ADR
                                            WHERE   ADR.ORG_ID = ORG.ORG_ID) AS ADR
                            FROM    ORGANIZATION ORG
                                                    )),
            XMLType('<?xml version="1.0" encoding="UTF-8"?>
                     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                     <xsl:output indent="yes" encoding="WINDOWS-1251"/>
                     <xsl:template match="/">
                     <ORGS>
                     <xsl:for-each select="ROWSET/ROW">
                         <ORG>
                             <ORG_ID><xsl:value-of select="ORG_ID"/></ORG_ID>
                             <ORG_NAME><xsl:value-of select="ORG_NAME"/></ORG_NAME>
                             <xsl:for-each select="ADR/ADR_ROW">
                                 <ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
                             </xsl:for-each>
                         </ORG>                         
                     </xsl:for-each>
                     </ORGS>
                     </xsl:template>
                     </xsl:stylesheet>'))                                                
FROM dual


Помогите еще разобраться, попытался немного изменить формат вывода и ADDRESS выводить не внутрь тега
<ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
а как значение тега <ADDRESS value=""/> и не могу понять как это вообще можно сделать
...
Рейтинг: 0 / 0
25.01.2011, 13:13
    #37077348
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
lLocustПомогите еще разобраться, попытался немного изменить формат вывода и ADDRESS выводить не внутрь тега
<ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
а как значение тега <ADDRESS value=""/> и не могу понять как это вообще можно сделать
Через xsl:attribute
...
Рейтинг: 0 / 0
25.01.2011, 13:19
    #37077365
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
Код: plaintext
1.
2.
3.
4.
ORA- 31011 : сбой разбора XML
ORA- 19202 : Возникла ошибка при обработке XML 
LPX- 00209 : начинающиеся с 'XML' имена PI являются зарезервированными
Error at line  1 
Вероятно пробел, перевод строки перед <xml>. Кроме того, желателен один тег верхнего уровня (типа ORGS), а не раздельные ORG.
...
Рейтинг: 0 / 0
25.01.2011, 13:48
    #37077438
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
Через "самостоятельно"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH ORGANIZATION AS (  SELECT  1  ORG_ID, 'Коровье вымя' ORG_NAME FROM dual UNION ALL
                        SELECT  2  ORG_ID, 'Бычье счастье' ORG_NAME FROM dual 
), ORG_ADDRESS    AS (  SELECT  1  ORG_ID, 'Женское поле №1' ADDRESS FROM dual UNION ALL
                        SELECT  1  ORG_ID, 'Женское поле №2' ADDRESS FROM dual UNION ALL
                        SELECT  2  ORG_ID, 'Мужское поле №15' ORG_NAME FROM dual UNION ALL 
                        SELECT  2  ORG_ID, 'Мужское поле №17' ORG_NAME FROM dual
)
select xmlagg(xmlelement(org, xmlforest(org_id, org_name), xmlagg(xmlelement(address, xmlattributes(address as value)))))
from ORGANIZATION o join ORG_ADDRESS a using (org_id)
group by org_id, org_name
;

<ORG>
  <ORG_ID> 1 </ORG_ID><ORG_NAME>Коровье вымя</ORG_NAME>
  <ADDRESS VALUE="Женское поле №1"></ADDRESS>
  <ADDRESS VALUE="Женское поле №2"></ADDRESS>
</ORG>
<ORG>
  <ORG_ID> 2 </ORG_ID><ORG_NAME>Бычье счастье</ORG_NAME>
  <ADDRESS VALUE="Мужское поле №15"></ADDRESS>
  <ADDRESS VALUE="Мужское поле №17"></ADDRESS>
</ORG>
...
Рейтинг: 0 / 0
28.01.2011, 11:09
    #37083740
lLocust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
-2-, Denis Popov,

Огромное спасибо, оба варианта работают на отлично.

Если использовать вариант -2-, то получается немного быстрее (прирост 4-5% скорости).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
13.11.2017, 13:05
    #39552158
sqlbeginer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
Друзья,
тоже при помощи xslt нужно переделать вот что
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<lst>
  <rec>
    <clmn>b11</clmn>
    <clmn>b12</clmn>
    ....
    <clmn>b1n</clmn>
  </rec>
  <rec>
    <clmn>b21</clmn>
    <clmn>b22</clmn>
    ....
    <clmn>b2n</clmn>
  </rec>
</lst> 



в
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<lst>
  <field rec="1" clmn="1">b11</field >
  <field rec="1" clmn="2">b12</field >
  ...
  <field rec="1" clmn="n">b1n</field >
  <field rec="2" clmn="1">b21</field >
  <field rec="2" clmn="2">b22</field >
  ...
  <field rec="2" clmn="n">b2n</field >
</lst> 


Помогите пожалуйста, а то долго гуглюсь.
...
Рейтинг: 0 / 0
13.11.2017, 13:33
    #39552181
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
Код: 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 s as (
select *
from xmltable(
'/lst/rec/clmn'
passing xmltype('
<lst>
  <rec>
    <clmn>b11</clmn>
    <clmn>b12</clmn>
    ....
    <clmn>b1n</clmn>
  </rec>
  <rec>
    <clmn>b21</clmn>
    <clmn>b22</clmn>
    ....
    <clmn>b2n</clmn>
  </rec>
</lst>')
columns
rec_id     number path 'for $i in ../. return count(../../*[. << $i]) + 1',
col_id     number path 'for $i in    . return count(   ../*[. << $i]) + 1',
col_val    varchar2(4000) path './text()'
))
select
xmlelement("lst",
           xmlagg(xmlelement("field", xmlattributes(rec_id as "rec", col_id as "clmn"), col_val))
          ) xml
from s;

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<lst>
    <field rec="1" clmn="1">b11</field>
    <field rec="1" clmn="2">b12</field>
    <field rec="1" clmn="3">b1n</field>
    <field rec="2" clmn="1">b21</field>
    <field rec="2" clmn="2">b22</field>
    <field rec="2" clmn="3">b2n</field>
</lst>
...
Рейтинг: 0 / 0
13.11.2017, 13:58
    #39552202
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
Count в 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.
31.
32.
33.
34.
35.
36.
37.
38.
with t as (
select *
from xmltable(
'/lst/rec'
passing xmltype('
<lst>
  <rec>
    <clmn>b11</clmn>
    <clmn>b12</clmn>
    ....
    <clmn>b1n</clmn>
  </rec>
  <rec>
    <clmn>b21</clmn>
    <clmn>b22</clmn>
    ....
    <clmn>b2n</clmn>
  </rec>
</lst>')
columns
rec_id for ordinality,
cols   xmltype path '.'
)),
s as (
select rec_id, col_id, col_val
from t,
xmltable(
'/rec/clmn'
passing t.cols
columns
col_id   for ordinality,
col_val  varchar2(4000) path 'text()'
))
select
xmlelement("lst",
           xmlagg(xmlelement("field", xmlattributes(rec_id as "rec", col_id as "clmn"), col_val))
          ) xml
from s;

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<lst>
    <field rec="1" clmn="1">b11</field>
    <field rec="1" clmn="2">b12</field>
    <field rec="1" clmn="3">b1n</field>
    <field rec="2" clmn="1">b21</field>
    <field rec="2" clmn="2">b22</field>
    <field rec="2" clmn="3">b2n</field>
</lst>
...
Рейтинг: 0 / 0
13.11.2017, 14:35
    #39552254
sqlbeginer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
AmKad,

cпасибо!
А можно ли ещё вариант с использованием xslt, например, xmltransorm?
...
Рейтинг: 0 / 0
20.11.2017, 14:30
    #39556193
sqlbeginer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с XMLTYPE и XMLTransform
AmKad,

AmKadCount в xquery-цикле в приведенном мною выше примере работает небыстро, и наверное, не всегда безбАжно.

Действительно, вот тут глючит:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
(см. XSLT цикл )

Хотя возможно, связано с каким-нибудь параметром, а-ля collation.

На других бд под 11.2.0.4.0 всё отлично
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непонятки с XMLTYPE и XMLTransform / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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