Search code examples
sqlxmloracle-databasehierarchical

Oracle SQL: How to get xml from hierarchical table


id  parent_id  Name         Text
0 ...........  body_text   

1 ..........0  text....... . something

2 ..........0  blank       

3 ..........2  text ........ something

4 ...........  info        

5 ..........4  text ........ something

Who knows how to get the following xml format from the previous hierarchical table:

<?xml version "................."?>
<body_text>
<text>something</text>
<blank>
    <text>something</text>
</blank>
</body_text>
<info>
 <text>some</text>
</info>

The only know how to do part of this is and now that isn't working either:

select DBMS_XMLGEN.getXML(DBMS_XMLGEN.newcontextfromhierarchy('SELECT level,
XMLElement(evalname(Name), text))
from my_table t
START WITH id_parent is null
CONNECT BY PRIOR id = parent_id'))
 FROM dual

Solution

  • The query you have provided will give you result you are expecting. You just have a couple of syntactical errors. First. parent_id and id_parent column names have a different position of id in your query. Make them the same. Second. remove last parenthesis ) from XMLElement(evalname(Name), text))

    SQL> set long 300
    
    SQL> create table  t1 (id1,  parent_id,  Name1, Text) as(
      2  select 0, null, 'body_text', null        from dual union all
      3  select 1, 0,    'text',      'something' from dual union all
      4  select 2, 0,    'blank',     null        from dual union all
      5  select 3, 2,    'text' ,     'something' from dual union all
      6  select 4, null, 'info',      null        from dual union all
      7  select 5, 4,    'text',     'something'  from dual
      8  );
    
    Table created
    
    SQL> select DBMS_XMLGEN.getXML(DBMS_XMLGEN.newcontextfromhierarchy('SELECT level,
      2     XMLElement(evalname(Name1), text)
      3    from t1 t
      4    start with parent_id is null
      5    connect by prior id1 = parent_id')) xml
      6   from dual
      7  ;
    
    xml
    --------------------------------------------------------------------------------
    <body_text>
      <text>something</text>
      <blank>
        <text>something</text>
      </blank>
    </body_text>
    <info>
      <text>something</text>
    </info>
    
    SQL>  select '<?xml version="1.0" ?>'
      2     || chr(10)
      3     || DBMS_XMLGEN.getXML(DBMS_XMLGEN.newcontextfromhierarchy('SELECT level,
      4            XMLElement(evalname(Name1), text)
      5          from t1 t
      6          start with parent_id is null
      7          connect by prior id1 = parent_id')) as xml
      8   FROM dual
      9  ;
    
    XML
    --------------------------------------------------------------------------------
    <?xml version="1.0" ?>
    <body_text>
      <text>something</text>
      <blank>
        <text>something</text>
      </blank>
    </body_text>
    <info>
      <text>something</text>
    </info>