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

Есть исходные данные
Код: 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
непонятки с XMLTYPE и XMLTransform
    #37077051
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может тогда проще создать XML самостоятельно, через XmlElement?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
непонятки с XMLTYPE и XMLTransform
    #37077058
vie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
непонятки с XMLTYPE и XMLTransform
    #37077134
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
непонятки с XMLTYPE и XMLTransform
    #37077136
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
непонятки с XMLTYPE и XMLTransform
    #37077201
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-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
непонятки с XMLTYPE и XMLTransform
    #37077312
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
непонятки с XMLTYPE и XMLTransform
    #37077348
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lLocustПомогите еще разобраться, попытался немного изменить формат вывода и ADDRESS выводить не внутрь тега
<ADDRESS><xsl:value-of select="ADDRESS"/></ADDRESS>
а как значение тега <ADDRESS value=""/> и не могу понять как это вообще можно сделать
Через xsl:attribute
...
Рейтинг: 0 / 0
непонятки с XMLTYPE и XMLTransform
    #37077365
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
ORA- 31011 : сбой разбора XML
ORA- 19202 : Возникла ошибка при обработке XML 
LPX- 00209 : начинающиеся с 'XML' имена PI являются зарезервированными
Error at line  1 
Вероятно пробел, перевод строки перед <xml>. Кроме того, желателен один тег верхнего уровня (типа ORGS), а не раздельные ORG.
...
Рейтинг: 0 / 0
непонятки с XMLTYPE и XMLTransform
    #37077438
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через "самостоятельно"
Код: 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
непонятки с XMLTYPE и XMLTransform
    #37083740
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-, Denis Popov,

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

Если использовать вариант -2-, то получается немного быстрее (прирост 4-5% скорости).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
непонятки с XMLTYPE и XMLTransform
    #39552158
sqlbeginer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья,
тоже при помощи 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
непонятки с XMLTYPE и XMLTransform
    #39552181
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
непонятки с XMLTYPE и XMLTransform
    #39552202
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
непонятки с XMLTYPE и XMLTransform
    #39552254
sqlbeginer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

cпасибо!
А можно ли ещё вариант с использованием xslt, например, xmltransorm?
...
Рейтинг: 0 / 0
непонятки с XMLTYPE и XMLTransform
    #39556193
sqlbeginer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непонятки с XMLTYPE и XMLTransform
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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