Re: Question about XML and Oracle.

From: John Peterson <j0hnp_at_comcast.net>
Date: Wed, 1 Dec 2010 11:03:56 -0700
Message-ID: <GZCdnayPoMj_E2vRnZ2dnUVZ5jadnZ2d_at_giganews.com>


"Maxim Demenko" <mdemenko_at_gmail.com> wrote in message news:4CE6B7C6.4080107_at_gmail.com...

> On 18.11.2010 21:30, John Peterson wrote:

>> I'm not sure if this is the correct forum, but I'll give it a shot.
>>
>> I'm using the Oracle built-in XML functions to format a result set into
>> an XML representation.
>>
>> However, I can't quite figure out how to "wrap" my results with a
>> header/footer.
>>
>> For example, I want my output to be:
>>
>> <?xml version="1.0" encoding="UTF-8" ?>
>> <OuterElement>
>> <AllMyQueryResultsXML/>
>> </OuterElement>
>>
>> I've successfully created a multi-row query that generates the
>> <AllMyQueryResultsXML>. But, I can't figure out how to get the final
>> step of wrapping those results in the version and <OuterElement> aspects.
>>
>> I know I can use XMLRoot for the version aspect. But the <OuterElement>
>> eludes me. I've tried doing stuff like:
>>
>> select xmltype("<OuterElement>") from dual
>> union all
>> ....MyMultiRowQueryThatReturnsXMLTYPE...
>> union all
>> select xmltype("</OuterElement>") from dual
>>
>> But that doesn't work, because XMLTYPE expects well-formed XML. I've
>> tried variations on the theme with XMLSERIALIZE and XMLCONCAT, but I
>> can't seem to get it to work.
>>
>> Any help that anyone can provide would be *much* appreciated.
>>
>> Thanks!
>>
>>
>
> You may try something like this:
>
> SQL> select xmlroot(
>   2           xmlelement("OuterElement",
>   3              xmltype(cursor(select loc from dept))
>   4                     )
>   5           , version '1.0').extract('/') xml
>   6  from dual
>   7  /
>
> XML
> -------------------------
> <?xml version="1.0"?>
> <OuterElement>
>   <ROWSET>
>     <ROW>
>       <LOC>NEW YORK</LOC>
>     </ROW>
>     <ROW>
>       <LOC>DALLAS</LOC>
>     </ROW>
>     <ROW>
>       <LOC>CHICAGO</LOC>
>     </ROW>
>     <ROW>
>       <LOC>BOSTON</LOC>
>     </ROW>
>   </ROWSET>
> </OuterElement>
>
> where xmltype(cursor(...)) should represent your data like in 
> "MyMultiRowQueryThatReturnsXMLTYPE"
> Note, that extract('/') is added only to make pretty print of produced 
> xml, it isn't necessary for your purpose.
>
> Best regards
>
> Maxim

Dear Maxim,

Thanks so much for the tip! This seems to work great!

I wish there were some way to eliminate the embedded <ROWSET><ROW><XMLRESULT> tags -- but I guess it's simple enough to search/replace "after the fact".

The crux of what I was missing (I think) was that nifty "cursor" keyword. Very interesting...

Thanks again!   Received on Wed Dec 01 2010 - 12:03:56 CST

Original text of this message