This example shows how to create an Oracle XML object using DBMS_XMLDOM package. It includes
- XML declaration (Version and Charset)
- XML namespace
- Looping through a cursor to add recursive nodes
PART_CATALOG table consists of records in below structure
Part_No | Description | UOM |
---|---|---|
TEST1 | test1 | pcs |
TEST11 | Test 1 | pcs |
TEST111 | 111 | VIAL |
DECLARE
L_XMLTYPE XMLTYPE;
L_DOMDOC DBMS_XMLDOM.DOMDOCUMENT;
L_ROOT_NODE DBMS_XMLDOM.DOMNODE;
PARTS_ELEMENT DBMS_XMLDOM.DOMELEMENT;
PARTS_NODE DBMS_XMLDOM.DOMNODE;
PART_ELEMENT DBMS_XMLDOM.DOMELEMENT;
PART_NODE DBMS_XMLDOM.DOMNODE;
PART_NO_ELEMENT DBMS_XMLDOM.DOMELEMENT;
PART_NO_NODE DBMS_XMLDOM.DOMNODE;
DESC_ELEMENT DBMS_XMLDOM.DOMELEMENT;
DESC_NODE DBMS_XMLDOM.DOMNODE;
UOM_ELEMENT DBMS_XMLDOM.DOMELEMENT;
UOM_NODE DBMS_XMLDOM.DOMNODE;
TEXT_ DBMS_XMLDOM.DOMTEXT;
TEXT_NODE_ DBMS_XMLDOM.DOMNODE;
ATTR_ DBMS_XMLDOM.DOMATTR;
CURSOR get_parts IS
SELECT * FROM part_catalog
WHERE part_no LIKE 'TEST%';
BEGIN
-- Create an empty XML document
L_DOMDOC := DBMS_XMLDOM.NEWDOMDOCUMENT;
--XML declaration
dbms_xmldom.setVersion(L_DOMDOC, '1.0" encoding="UTF-8');
dbms_xmldom.setCharset(L_DOMDOC,'UTF-8');
-- Create a root node
L_ROOT_NODE := DBMS_XMLDOM.MAKENODE (L_DOMDOC);
--<parts>
PARTS_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'parts');
PARTS_NODE := DBMS_XMLDOM.APPENDCHILD (L_ROOT_NODE,DBMS_XMLDOM.MAKENODE (PARTS_ELEMENT));
--add xmlns
ATTR_ := DBMS_XMLDOM.CREATEATTRIBUTE (L_DOMDOC, 'xmlns:xsd');
DBMS_XMLDOM.SETVALUE(ATTR_,'http://www.w3.org/2001/XMLSchema');
ATTR_ := DBMS_XMLDOM.SETATTRIBUTENODE(PARTS_ELEMENT,ATTR_);
ATTR_ := DBMS_XMLDOM.CREATEATTRIBUTE (L_DOMDOC, 'xmlns:xsi');
DBMS_XMLDOM.SETVALUE(ATTR_,'http://www.w3.org/2001/XMLSchema-instance');
ATTR_ := DBMS_XMLDOM.SETATTRIBUTENODE(PARTS_ELEMENT,ATTR_);
ATTR_ := DBMS_XMLDOM.CREATEATTRIBUTE (L_DOMDOC, 'xmlns:ns1');
DBMS_XMLDOM.SETVALUE(ATTR_,'IFS.MasterPartRec');
ATTR_ := DBMS_XMLDOM.SETATTRIBUTENODE(PARTS_ELEMENT,ATTR_);
FOR partRec IN get_parts LOOP
--<part>
PART_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'part');
PART_NODE := DBMS_XMLDOM.APPENDCHILD (PARTS_NODE, DBMS_XMLDOM.MAKENODE (PART_ELEMENT));
--<part_no>
PART_NO_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'part_no');
PART_NO_NODE := DBMS_XMLDOM.APPENDCHILD (PART_NODE, DBMS_XMLDOM.MAKENODE (PART_NO_ELEMENT));
TEXT_ := DBMS_XMLDOM.CREATETEXTNODE (L_DOMDOC, partRec.part_no);
TEXT_NODE_ := DBMS_XMLDOM.APPENDCHILD (PART_NO_NODE, DBMS_XMLDOM.MAKENODE(TEXT_));
--<description>
DESC_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'description');
DESC_NODE := DBMS_XMLDOM.APPENDCHILD (PART_NODE, DBMS_XMLDOM.MAKENODE (DESC_ELEMENT));
TEXT_ := DBMS_XMLDOM.CREATETEXTNODE (L_DOMDOC, partRec.description);
TEXT_NODE_ := DBMS_XMLDOM.APPENDCHILD (DESC_NODE, DBMS_XMLDOM.MAKENODE (TEXT_));
--<uom>
UOM_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'unit_code');
UOM_NODE := DBMS_XMLDOM.APPENDCHILD (PART_NODE, DBMS_XMLDOM.MAKENODE (UOM_ELEMENT));
TEXT_ := DBMS_XMLDOM.CREATETEXTNODE (L_DOMDOC, partRec.unit_code);
TEXT_NODE_ := DBMS_XMLDOM.APPENDCHILD (UOM_NODE, DBMS_XMLDOM.MAKENODE (TEXT_));
--uom attr
ATTR_ := DBMS_XMLDOM.CREATEATTRIBUTE (L_DOMDOC, 'measured_dttm');
DBMS_XMLDOM.SETVALUE(ATTR_,TO_CHAR(SYSDATE, 'DD-MM-YYYY hh:mi:ss'));
ATTR_ := DBMS_XMLDOM.SETATTRIBUTENODE(UOM_ELEMENT,ATTR_);
NULL;
END LOOP;
L_XMLTYPE := DBMS_XMLDOM.GETXMLTYPE (L_DOMDOC);
DBMS_XMLDOM.FREEDOCUMENT (L_DOMDOC);
DBMS_OUTPUT.PUT_LINE (L_XMLTYPE.GETCLOBVAL);
END;
Output XML looks like following
<?xml version="1.0" encoding="UTF-8"?>
<parts xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="IFS.MasterPartRec">
<part>
<part_no>TEST1</part_no>
<description>test1</description>
<unit_code measured_dttm="06-06-2020 07:49:28">pcs</unit_code>
</part>
<part>
<part_no>TEST11</part_no>
<description>Test 1</description>
<unit_code measured_dttm="06-06-2020 07:49:28">pcs</unit_code>
</part>
<part>
<part_no>TEST111</part_no>
<description>111</description>
<unit_code measured_dttm="06-06-2020 07:49:28">VIAL</unit_code>
</part>
</parts>
It Worked. Thanks Damith! 🙂
Works great. Thanks Damith! 🙂
Thanks Charith!