This article presents methods to transform an SQL to XML format with minimum effort possible.
Let’s take simple SQL
SELECT owner, table_name FROM dba_tables WHERE table_name LIKE 'USER%' and owner='SYS'; OWNER TABLE_NAME ------------------------------ ------------------------------ SYS USER_HISTORY$ SYS USER_ASTATUS_MAP SYS USER$
and try to transform it into XML format
- XMLTYPE method
SELECT XMLTYPE(CURSOR(
SELECT owner, table_name
FROM dba_tables
WHERE table_name LIKE 'USER%' and owner='SYS'
)
).getclobval()
FROM dual;
<?xml version="1.0"?>
<ROWSET>
<ROW>
<OWNER>SYS</OWNER>
<TABLE_NAME>USER_HISTORY$</TABLE_NAME>
</ROW>
<ROW>
<OWNER>SYS</OWNER>
<TABLE_NAME>USER_ASTATUS_MAP</TABLE_NAME>
</ROW>
<ROW>
<OWNER>SYS</OWNER>
<TABLE_NAME>USER$</TABLE_NAME>
</ROW>
</ROWSET>
- DBMS_XMLGEN method
SELECT dbms_xmlgen.getxmltype ( 'SELECT owner, table_name FROM dba_tables WHERE table_name LIKE ''USER%'' and owner=''SYS''' ).getclobval() FROM dual; <ROWSET> <ROW> <OWNER>SYS</OWNER> <TABLE_NAME>USER_HISTORY$</TABLE_NAME> </ROW> <ROW> <OWNER>SYS</OWNER> <TABLE_NAME>USER_ASTATUS_MAP</TABLE_NAME> </ROW> <ROW> <OWNER>SYS</OWNER> <TABLE_NAME>USER$</TABLE_NAME> </ROW> </ROWSET>
- Using XMLELEMENT, XMLAGG functions. Output for this method is generated in one line but I formatted it for better presentation.
SELECT
XMLELEMENT("ROWSET",
XMLAGG(
XMLELEMENT("ROW",
XMLELEMENT("OWNER", owner),
XMLELEMENT("TABLE_NAME", table_name)))).getclobval()
FROM dba_tables
WHERE table_name LIKE 'USER%'
AND owner='SYS'
<ROWSET>
<ROW>
<OWNER>SYS</OWNER>
<TABLE_NAME>USER_HISTORY$</TABLE_NAME>
</ROW>
<ROW>
<OWNER>SYS</OWNER>
<TABLE_NAME>USER_ASTATUS_MAP</TABLE_NAME>
</ROW>
<ROW>
<OWNER>SYS</OWNER>
<TABLE_NAME>USER$</TABLE_NAME>
</ROW>
</ROWSET>
Following two functions are useful in package UTL_I18N:
- ESCAPE_REFERENCE – converts special xml characters <,>,&,’,” to escape sequence
SELECT
UTL_I18N.ESCAPE_REFERENCE('<tag>data in tag</tag>')
FROM dual;
UTL_I18N.ESCAPE_REFERENCE('<TAG>DATAINTAG</TAG>')
---------------------------------------------------
<tag>data in tag</tag>
- UNESCAPE_REFERENCE – opposite to escape_reference
SELECT
UTL_I18N.UNESCAPE_REFERENCE('<tag>data in tag</tag>')
FROM dual;
UTL_I18N.UNESCAPE_REFERENCE('<TAG>DATAINTAG</TAG>')
----------------------------------------------------------------
<tag>data in tag</tag>
Have a fun 🙂
Tomasz