sql >> Database teknologi >  >> RDS >> Oracle

Fra XML til liste over stier i Oracle 12c

SQL Fiddle

Oracle 11g R2 Schema Setup :

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;   
 

Forespørgsel 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'
       )
 

Resultater :

| 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. hvordan man undslipper input, men gemmer uescaped i databasen

  2. Sådan ser du det største afkast fra din Microsoft Access-database

  3. Sådan holder du forbindelsen i live i java

  4. Sådan installeres MySQL 8 på Ubuntu