Skip to content

Instantly share code, notes, and snippets.

@aykononov
Last active April 7, 2020 14:29
Show Gist options
  • Save aykononov/54ffc0839e39e5440dae351e2fd91b49 to your computer and use it in GitHub Desktop.
Save aykononov/54ffc0839e39e5440dae351e2fd91b49 to your computer and use it in GitHub Desktop.
Выборка из XML не используя XSLT.
/*
Имеется:
xmltype('
<root>
<row>
<col>v11</col>
<col>v12</col>
<col>v13</col>
<col>v14</col>
</row>
<row>
<col>v21</col>
<col>v22</col>
<col>v23</col>
<col>v24</col>
</row>
</root>')
Необходимо:
Получить в виде результата колонку с типом xmltype SQL запроса со следующей структурой:
<root>
<data row="1" col="1">v11</data>
<data row="1" col="2">v12</data>
<data row="1" col="3">v13</data>
<data row="1" col="4">v14</data>
<data row="2" col="1">v21</data>
<data row="2" col="2">v22</data>
<data row="2" col="3">v23</data>
<data row="2" col="4">v24</data>
</root>
Реализовать данный запрос не используя XSLT трансформацию.
Условие: количество узлов row и col может варьироваться
(прим. это более сложный пример, можно вернуть условие что количество col всегда статично = 4 шт в пределах row)
*/
SELECT XMLTYPE(
XMLSERIALIZE(
CONTENT XMLELEMENT("root",
XMLQUERY('for $i at $pi in /root/row
for $j at $pj in /$i/col
return <data row="{$pi}" col="{$pj}"> {$i/$j/text()}</data>'
passing x RETURNING CONTENT ))INDENT ))AS "xmlout"
FROM (SELECT XMLTYPE(
'<root>
<row>
<col>v11</col>
<col>v12</col>
<col>v13</col>
<col>v14</col>
</row>
<row>
<col>v21</col>
<col>v22</col>
<col>v23</col>
<col>v24</col>
</row>
</root>') AS x
FROM DUAL);
@aykononov
Copy link
Author

aykononov commented Nov 11, 2019

Имеется 
xmltype('
<root>
  <row>
    <col>v11</col>
    <col>v12</col>
    <col>v13</col>
    <col>v14</col>
  </row>
  <row>
    <col>v21</col>
    <col>v22</col>
    <col>v23</col>
    <col>v24</col>
  </row>
</root>')

Необходимо:
Получить в виде результата колонку с типом xmltype SQL запроса со следующей структурой:

<root>
   <data row="1" col="1">v11</data>
   <data row="1" col="2">v12</data>
   <data row="1" col="3">v13</data>
   <data row="1" col="4">v14</data>
   <data row="2" col="1">v21</data>
   <data row="2" col="2">v22</data>
   <data row="2" col="3">v23</data>
   <data row="2" col="4">v24</data>
</root>


Реализовать данный запрос не используя XSLT трансформацию.
Условия: количество узлов row и col может варьироваться (прим. это более сложный пример, можно вернуть условие что количество col всегда статично = 4 шт в пределах row)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment