Oracle DBMS_XMLGEN
Version 26ai

General Information
Library Note Morgan's Library Page Header
The best Oracle News for FY2026

Oracle Database 26ai will be available on generic Linux platforms in January and soon on AIX and Windows
Purpose Converts the results of a SQL query to a canonical XML format. The package takes an arbitrary SQL query as input, converts it to XML format, and returns the result as a CLOB. This package is similar to the DBMS_XMLQUERY package, except that it is written in C and compiled into the kernel. This package can only be run on the database.
AUTHID CURRENT_USER
Constants
Name Data Type Value
 Conversion/Schema Specs
DTD NUMBER 1
NONE NUMBER 0
SCHEMA NUMBER 2
 Conversion Types
ENTITY_DECODE conversionType 1
ENTITY_ENCODE conversionType 0
 NULL Handling
DROP_NULLS NUMBER 0
EMPTY_TAG NUMBER 2
NULL_ATTR NUMBER 1
Data Types SUBTYPE ctxHandle IS NUMBER;
SUBTYPE ctxType IS NUMBER;
SUBTYPE conversionType IS NUMBER;

TYPE PARAM_HASH IS TABLE OF VARCHAR2(100)
INDEX BY VARCHAR2(32);
/
Dependencies
DBA_AUTO_INDEX_CONFIG DBMS_XMLGEN_LIB URIFACTORY
DBMS_CUBE DRIREPM URITYPE
DBMS_LOB PRVTEMX_CELL WRI$_ADV_OBJSPACE_TREND_T
DBM_RCVCAT SDO_OLS XMLTYPE
Determine if XDB is installed and valid col comp_name format a45

SELECT comp_name, status, substr(version,1,10) as version
FROM dba_registry
ORDER BY 1;

COMP_NAME                                     STATUS      VERSION
--------------------------------------------- ----------- ----------
JServer JAVA Virtual Machine                  VALID       23.0.0.0.0
Messaging Gateway                             VALID       23.0.0.0.0
Oracle Database Catalog Views                 VALID       23.0.0.0.0
Oracle Database Java Packages                 VALID       23.0.0.0.0
Oracle Database Packages and Types            VALID       23.0.0.0.0
Oracle Database Vault                         VALID       23.0.0.0.0
Oracle Label Security                         VALID       23.0.0.0.0
Oracle OLAP API                               VALID       23.0.0.0.0
Oracle Real Application Clusters              VALID       23.0.0.0.0
Oracle Text                                   VALID       23.0.0.0.0
Oracle Workspace Manager                      VALID       23.0.0.0.0
Oracle XDK                                    VALID       23.0.0.0.0
Oracle XML Database                           VALID       23.0.0.0.0
Spatial                                       VALID       23.0.0.0.0


-- if not installed run
$ORACLE_HOME/rdbms/admin/initxml.sql
Demo Table for this page -- emp table from SCOTT schema
CREATE TABLE test (testcol VARCHAR2(4000));
Documented Yes
First Available 9.0
Security Model Owned by SYS with EXECUTE granted to PUBLIC
Source $ORACLE_HOME/rdbms/admin/dbmsxml.sql
Subprograms
 
clearBindValues
Undocumented dbms_xmlgen.clearBindValues(ctx IN ctxHandle);
TBD
 
closeContext
Closes a given context and releases all resources associated with it, including the SQL cursor and bind and define buffers dbms_xmlgen.closeContext(ctx IN ctxHandle);
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 emp_no NUMBER := 7369;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp WHERE empno = '|| emp_no);
  dbms_xmlgen.closeContext(ctx);
  dbms_output.put_line(ctx);
END;
/
 
Convert
Converts the XML into the escaped or unescaped XML equivalent. Flag is a Conversion Type constant.
Overload 1
dbms_xmlgen.convert(
xmlData IN VARCHAR2,
flag    IN NUMBER := ENTITY_ENCODE)
RETURN VARCHAR2;
TBD
Overload 2 dbms_xmlgen.convert(xmlData IN CLOB, flag IN NUMBER := ENTITY_ENCODE) RETURN CLOB;
TBD
 
getNumRowsProcessed
Returns the number of SQL rows that were processed in the last call to getXML dbms_xmlgen.getNumRowsProcessed(ctx IN ctxHandle) RETURN NUMBER;
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
 emp_no NUMBER := 7369;
 i      PLS_INTEGER;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp WHERE empno = '|| emp_no);

  xml := dbms_xmlgen.getXML(ctx);
  i := dbms_xmlgen.getNumRowsProcessed(ctx);
  dbms_output.put_line(TO_CHAR(i));
END;
/
 
getXML
Gets the XML document

Overload 1
dbms_xmlgen.getXML(
ctx         IN            ctxHandle,
tmpclob     IN OUT NOCOPY CLOB,
dtdOrSchema IN            NUMBER := NONE);
TBD
Overload 2 dbms_xmlgen.getXML(
ctx         IN ctxHandle,
dtdOrSchema IN NUMBER := NONE)
RETURN CLOB;
TBD
Overload 3 dbms_xmlgen.getXML(
sqlQuery    IN VARCHAR2,
dtdOrSchema IN NUMBER := NONE)
RETURN CLOB;
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
 emp_no NUMBER := 7369;
 xmlc   VARCHAR2(4000); -- required to convert LOB to VARCHAR2
 off    PLS_INTEGER := 1;
 len    PLS_INTEGER := 4000;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp WHERE empno = ' || emp_no);
  dbms_output.put_line(ctx);

  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);

  dbms_xmlgen.closeContext(ctx);

  dbms_lob.read(xml, len, off, xmlc); -- display first part
  dbms_output.put_line(xmlc);
END;
/
 
getXMLType
Gets the XML document and returns it as XMLType

Overload 1
dbms_xmlgen.getXMLType(
ctx         IN            ctxHandle,
tmpxmltype  IN OUT NOCOPY xmltype,
dtdOrSchema IN            NUMBER := NONE);
See newContextFromHierarchy Demo
Overload 2 dbms_xmlgen.getXMLType(
ctx         IN ctxHandle,
dtdOrSchema IN NUMBER := NONE)
RETURN sys.XMLType;
TBD
Overload 3 dbms_xmlgen.getXMLType(
sqlQuery    IN VARCHAR2,
dtdOrSchema IN NUMBER := NONE)
RETURN sys.XMLType;
TBD
 
newContext
Creates a new context handle

Overload 1
dbms_xmlgen.newContext(query VARCHAR2) RETURN ctxHandle;
conn uwclass/uwclass@pdbdev

set serveroutput on

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 sid_no NUMBER := 7369;
BEGIN
  ctx := dbms_xmlgen.newContext(
         'SELECT * FROM servers WHERE srvr_id LIKE %' || id_no || '%');
  dbms_output.put_line(ctx);
  dbms_xmlgen.closeContext(ctx);
END;
/
Overload 2 dbms_xmlgen.newContext(queryString SYS_REFCURSOR) RETURN ctxHandle;
TBD
 
newContextFromHierarchy
Undocumented. Used as part of new XML document creation dbms_xmlgen.newContextFromHierarchy(queryString IN VARCHAR2) RETURN ctxHandle;
conn scott/tiger@pdbdev

desc emp

set serveroutput on

DECLARE
 qryctx dbmx_xmlgen.ctxhandle;
 result XMLTYPE;

 PROCEDURE lob_output (p_clob CLOB) IS l_clob CLOB;
  l_clob_length  NUMBER;
  l_iterations   NUMBER;
  l_chunk        VARCHAR2(32767);
  l_chunk_length NUMBER := 32767;
 BEGIN
   l_clob := p_clob;
   l_clob_length := dbms_lob.getlength(l_clob);
   l_iterations := CEIL(l_clob_length / l_chunk_length);

   FOR i IN 0 .. l_iterations - 1 LOOP
     l_chunk := dbms_lob.substr(l_clob,l_chunk_length,i*l_chunk_length+1);
     dbms_output.put_line(l_chunk);
   END LOOP;
 END;

BEGIN
  qryctx := dbms_xmlgen.newcontextFromHierarchy(
  'SELECT level,
                 XMLElement("Position", XMLElement("Name", ename),
                 XMLElement("Title", job))
                 FROM emp
                 CONNECT BY PRIOR empno = mgr START WITH mgr is NULL');

  result := dbms_xmlgen.getxmltype(qryctx);
  dbms_xmlgen.closeContext(qryctx);

  lob_output(RESULT.getClobVal());
END;
/
 
removeXSLTParam
Undocumented XSLT Support dbms_xmlgen.removeXSLTParam(
ctx  IN ctxType,
name IN VARCHAR2);
TBD
 
restartQuery
Restarts the query to start fetching from the beginning dbms_xmlgen.restartQUERY(ctx IN ctxHandle);
TBD
 
setBindValue
Undocumented dbms_xmlgen.setBindValue(
ctx       IN ctxHandle,
bindName  IN VARCHAR2,
bindValue IN VARCHAR2);
TBD
 
setCheckInvalidChars
Sets whether checking for invalid characters such as the NULL character dbms_xmlgen.setCheckInvalidChars(
ctx IN ctxHandle,
chk IN BOOLEAN);
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 emp_no NUMBER := 7369;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp WHERE empno = '|| emp_no);
  dbms_xmlgen.setCheckInvalidChars(ctx, TRUE);
  dbms_xmlgen.closeContext(ctx);
  dbms_output.put_line(ctx);
END;
/
 
setConvertSpecialChars
Sets whether special characters such as $, which are non-XML characters, should be converted or not to their escaped representation dbms_xmlgen.setConvertSpecialChars(
ctx  IN ctxHandle,
conv IN BOOLEAN);
TBD
 
setIndentationWidth
Undocumented dbms_xmlgen.setIndentationWidth(
ctx   IN ctxHandle,
width IN NUMBER);
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
  ctx    dbms_xmlgen.ctxHandle;
  xml    CLOB;
  emp_no NUMBER := 7369;
  xmlc   VARCHAR2(4000); -- required to convert LOB to VARCHAR2
  off    PLS_INTEGER := 1;
  len    PLS_INTEGER := 4000;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp WHERE empno = '|| emp_no);

  dbms_xmlgen.setIndentationWidth(ctx, 10);

  dbms_output.put_line(ctx);

  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);

  dbms_xmlgen.closeContext(ctx);

  dbms_lob.read(xml, len, off, xmlc); -- display first part
  dbms_output.put_line(xmlc);
END;
/
 
SetMaxRows
Sets the maximum number of rows to be fetched each time dbms_xmlgen.setMaxRows(
ctx     IN ctxHandle,
maxRows IN NUMBER);
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
 ctx  dbms_xmlgen.ctxHandle;
 xml  CLOB;
 xmlc VARCHAR2(4000); -- required to convert LOB to VARCHAR2
 off  PLS_INTEGER := 1;
 len  PLS_INTEGER := 4000;
 i    PLS_INTEGER;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp');
  dbms_xmlgen.setMaxRows(ctx, 14);
  xml := dbms_xmlgen.getXML(ctx);
  i := dbms_xmlgen.getNumRowsProcessed(ctx);
  dbms_output.put_line(TO_CHAR(i));
  dbms_xmlgen.closeContext(ctx);

  dbms_lob.read(xml, len, off, xmlc); -- display first part
  INSERT INTO test (testcol) VALUES (xmlc);
  COMMIT;
END;
/
 
setNullHandling
Sets NULL handling options
Flag is a NULL handling constant
dbms_xmlgen.setNullHandling(
ctx  IN ctxHandle,
flag IN NUMBER);
TBD
 
setPrettyPrinting
Undocumented dbms_xmlgen.setPrettyPrinting(
ctx IN ctxHandle,
pp  IN BOOLEAN);
TBD
 
setRowSetTag
Sets the name of the element enclosing the entire result dbms_xmlgen.setRowSetTag(
ctx           IN ctxHandle,
rowSetTagName IN VARCHAR2);
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
 emp_no NUMBER := 7369;
 xmlc   VARCHAR2(4000); -- required to convert LOB to VARCHAR2
 off    PLS_INTEGER := 1;
 len    PLS_INTEGER := 4000;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp WHERE empno = '|| emp_no);
  dbms_xmlgen.setRowSetTag(ctx, 'SRST');
  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);

  dbms_xmlgen.closeContext(ctx);

  dbms_lob.read(xml, len, off, xmlc); -- display first part
  dbms_output.put_line(xmlc);
END;
/
 
setRowTag
Sets the name of the element enclosing each row of the result dbms_xmlgen.setRowTag(
ctx        IN ctxHandle,
rowTagName IN VARCHAR2);
conn scott/tiger@pdbdev

set serveroutput on

DECLARE
 ctx    dbms_xmlgen.ctxHandle;
 xml    CLOB;
 emp_no NUMBER := 7369;

 xmlc VARCHAR2(4000); -- required to convert LOB to VARCHAR2
 off  PLS_INTEGER := 1;
 len  PLS_INTEGER := 4000;
BEGIN
  ctx := dbms_xmlgen.newContext('SELECT * FROM emp WHERE empno = '|| emp_no);
  dbms_xmlgen.setRowTag(ctx, 'SRT');
  xml := dbms_xmlgen.getXML(ctx);
  dbms_output.put_line(xml);

  dbms_xmlgen.closeContext(ctx);

  dbms_lob.read(xml, len, off, xmlc); -- display first part
  dbms_output.put_line(xmlc);
END;
/
 
setSkipRows
Sets the number of rows to skip every time before generating the XML dbms_xmlgen.setSkipRows(
ctx      IN ctxHandle,
skipRows IN NUMBER);
TBD
 
setXSLT
Undocumented
Overload 1
dbms_xmlgen.setXSLT(
ctx        IN ctxType,
stylesheet IN CLOB);
TBD
Overload 2 dbms_xmlgen.setXSLT(
ctx        IN ctxType,
stylesheet IN XMLType);
TBD
Overload 3 dbms_xmlgen.setXSLT(
ctx IN ctxType,
uri IN VARCHAR2);
TBD
 
setXSLTParam
Undocumented dbms_xmlgen.setXSLT(
ctx   IN ctxType,
name  IN VARCHAR2,
value IN VARCHAR2);
TBD
 
useItemTabsForColl
Forces the use of the collection column name appended with the tag _ITEM for collection elements dbms_xmlgen.useItemTagsForColl(ctx IN ctxHandle);
TBD
 
useNullAttributeIndicator
Specified whether to use an XML attribute to indicate NULLness, or to do it by omitting the inclusion of the particular entity in the XML document dbms_xmlgen.useNullAttributeIndicator(
ctx     IN ctxHandle,
attrind IN BOOLEAN := TRUE);
TBD

Related Topics
Built-in Functions
Built-in Packages
DBMS_LOB
DBMS_XMLQUERY
DBMS_XMLSTORE
XML Functions
What's New In 21c
What's New In 26ai

Morgan's Library Page Footer
This site is maintained by Daniel Morgan. Last Updated: This site is protected by copyright and trademark laws under U.S. and International law. © 1998-2026 Daniel A. Morgan All Rights Reserved