sql >> Database >  >> RDS >> Oracle

Van XML naar lijst met paden in Oracle 12c

SQL Fiddle

Oracle 11g R2 Schema-instellingen :

CREATE TABLE xml_data ( xml ) AS
  SELECT XMLTYPE('
    <ALFA>
      <BETA>0123</BETA> 
      <GAMMA attribute1="value1">2345</GAMMA> 
      <DELTA attribute2="value2"> 
         <EPSILON attribute3="value3" attribute4="value4">3</EPSILON> 
      </DELTA> 
    </ALFA> 
  ')
  FROM DUAL;   

Query 1 :

select xpath, text
from   xml_data d
       CROSS JOIN
       XMLTable( 
         'for $i in $doc/descendant-or-self::*
            let $path := $i/string-join(ancestor-or-self::*/name(.), ''/'')
            return <data>{attribute path {$path}, attribute value {$i/text()}}</data>' 
         PASSING d.xml AS "doc"
         COLUMNS xpath varchar2(4000) path '/data/@path', 
                 text  varchar2(4000) path '/data/@value'
       )
UNION ALL
select xpath, text
from   xml_data d
       CROSS JOIN
       XMLTable( 
         'for $i in $doc/descendant-or-self::*
            let $path := $i/string-join(ancestor-or-self::*/name(.), ''/'')
            for $j in $i/attribute::*
              return <data>{attribute path { concat( $path, "/@", $j/name(.) ) }, attribute value {$j}}</data>' 
         PASSING d.xml AS "doc"
         COLUMNS xpath varchar2(4000) path '/data/@path', 
                 text  varchar2(4000) path '/data/@value'
       )

Resultaten :

|                          XPATH |   TEXT |
|--------------------------------|--------|
|                           ALFA | (null) |
|                      ALFA/BETA |   0123 |
|                     ALFA/GAMMA |   2345 |
|                     ALFA/DELTA | (null) |
|             ALFA/DELTA/EPSILON |      3 |
|         ALFA/GAMMA/@attribute1 | value1 |
|         ALFA/DELTA/@attribute2 | value2 |
| ALFA/DELTA/EPSILON/@attribute3 | value3 |
| ALFA/DELTA/EPSILON/@attribute4 | value4 |



  1. Waarom Foreign Key-beperkingen gebruiken in MySQL?

  2. Query om alle records te krijgen totdat de som van de kolom kleiner is dan of gelijk is aan een waarde

  3. Hoe verander ik een MySQL-tabel in UTF-8?

  4. PostgreSQL-teken voor nieuwe regel