Hi do you mean to get this output:
<tag_one>
<user>
<two>something</two>
<tree>else</tree>
<four></four>
<group_tag>
<secondGoup>
<five>true</five>
<six>123</six>
</secondGoup>
<secondGoup>
<five>true</five>
<six>456</six>
</secondGoup>
<secondGoup>
<five>true</five>
<six>789</six>
</secondGoup>
</group_tag>
</user>
</tag_one>
this is the correct query:
SELECT XMLELEMENT (
"tag_one",
XMLAGG (
XMLELEMENT (
"user",
XMLFOREST (
'something' "two",
'else' "tree",
'' "four",
XMLFOREST (
XMLFOREST ('true' "five", 123 "six") "secondGoup",
XMLFOREST ('true' "five", 456 "six") "secondGoup",
XMLFOREST ('true' "five", 789 "six") "secondGoup") "group_tag"))))
AS "XML_QUERY"
FROM DUAL
===========EDIT=================
Hi Again, for you dynamic query we no longer can use XMLELEMT and related functions because they shall return clob and it will be a mess to work with them, I came to a very long pl/sql block for you here(it's way too larger and complicated, but I make it usable for your case):
DECLARE
L_XMLTYPE XMLTYPE;
L_DOMDOC DBMS_XMLDOM.DOMDOCUMENT;
L_ROOT_NODE DBMS_XMLDOM.DOMNODE;
L_SUPP_NUM_ELEMENT DBMS_XMLDOM.DOMELEMENT;
L_SUPP_NAME_ELEMENT DBMS_XMLDOM.DOMELEMENT;
L_SUPP_NUM_NODE DBMS_XMLDOM.DOMNODE;
L_SUPP_NAME_NODE DBMS_XMLDOM.DOMNODE;
L_SUPP_NUM_TNODE DBMS_XMLDOM.DOMNODE;
L_SUPP_NAME_TNODE DBMS_XMLDOM.DOMNODE;
L_SUPP_NUM_TEXT DBMS_XMLDOM.DOMTEXT;
L_SUPP_NAME_TEXT DBMS_XMLDOM.DOMTEXT;
L_C1 DBMS_XMLDOM.DOMELEMENT;
L_C1_NODE DBMS_XMLDOM.DOMNODE;
L_C2 DBMS_XMLDOM.DOMELEMENT;
L_C2_NODE DBMS_XMLDOM.DOMNODE;
L_C2_TEXT DBMS_XMLDOM.DOMTEXT;
L_C2_TEXT_NODE DBMS_XMLDOM.DOMNODE;
L_SUPPLIER_ELEMENT DBMS_XMLDOM.DOMELEMENT;
L_SUPPLIER_NODE DBMS_XMLDOM.DOMNODE;
L_SUP_NODE DBMS_XMLDOM.DOMNODE;
BEGIN
-- Create an empty XML document
L_DOMDOC := DBMS_XMLDOM.NEWDOMDOCUMENT;
-- Create a root node
L_ROOT_NODE := DBMS_XMLDOM.MAKENODE (L_DOMDOC);
-- Create a new Supplier Node and add it to the root node
L_SUP_NODE :=
DBMS_XMLDOM.APPENDCHILD (
L_ROOT_NODE,
DBMS_XMLDOM.MAKENODE (
DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'tag_one')));
L_C1 := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'user');
L_C1_NODE :=
DBMS_XMLDOM.APPENDCHILD (L_SUP_NODE, DBMS_XMLDOM.MAKENODE (L_C1));
L_C2 := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'two');
L_C2_NODE :=
DBMS_XMLDOM.APPENDCHILD (L_C1_NODE, DBMS_XMLDOM.MAKENODE (L_C2));
L_C2_TEXT := DBMS_XMLDOM.CREATETEXTNODE (L_DOMDOC, 'something');
L_C2_TEXT_NODE :=
DBMS_XMLDOM.APPENDCHILD (L_C2_NODE, DBMS_XMLDOM.MAKENODE (L_C2_TEXT));
L_C2 := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'three');
L_C2_NODE :=
DBMS_XMLDOM.APPENDCHILD (L_C1_NODE, DBMS_XMLDOM.MAKENODE (L_C2));
L_C2_TEXT := DBMS_XMLDOM.CREATETEXTNODE (L_DOMDOC, 'else');
L_C2_TEXT_NODE :=
DBMS_XMLDOM.APPENDCHILD (L_C2_NODE, DBMS_XMLDOM.MAKENODE (L_C2_TEXT));
L_C2 := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'group_tag');
L_C2_NODE :=
DBMS_XMLDOM.APPENDCHILD (L_C1_NODE, DBMS_XMLDOM.MAKENODE (L_C2));
FOR SUP_REC IN (SELECT T1.FIELD1, T2.FIELD2
FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.FIELD4 = T2.FIELD2
WHERE T2.FIELD3 = 3)
LOOP
-- For each record, create a new Supplier element
-- and add this new Supplier element to the Supplier Parent node
L_SUPPLIER_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'secondGoup');
L_SUPPLIER_NODE :=
DBMS_XMLDOM.APPENDCHILD (
L_C2_NODE,
DBMS_XMLDOM.MAKENODE (L_SUPPLIER_ELEMENT)
);
-- Each Supplier node will get a Number node which contains the Supplier Number as text
L_SUPP_NUM_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'five');
L_SUPP_NUM_NODE :=
DBMS_XMLDOM.APPENDCHILD (
L_SUPPLIER_NODE,
DBMS_XMLDOM.MAKENODE (L_SUPP_NUM_ELEMENT)
);
L_SUPP_NUM_TEXT := DBMS_XMLDOM.CREATETEXTNODE (L_DOMDOC, SUP_REC.FIELD1);
L_SUPP_NUM_TNODE :=
DBMS_XMLDOM.APPENDCHILD (
L_SUPP_NUM_NODE,
DBMS_XMLDOM.MAKENODE (L_SUPP_NUM_TEXT)
);
-- Each Supplier node will get a Name node which contains the Supplier Name as text
L_SUPP_NAME_ELEMENT := DBMS_XMLDOM.CREATEELEMENT (L_DOMDOC, 'six');
L_SUPP_NAME_NODE :=
DBMS_XMLDOM.APPENDCHILD (
L_SUPPLIER_NODE,
DBMS_XMLDOM.MAKENODE (L_SUPP_NAME_ELEMENT)
);
L_SUPP_NAME_TEXT :=
DBMS_XMLDOM.CREATETEXTNODE (L_DOMDOC, SUP_REC.FIELD2);
L_SUPP_NAME_TNODE :=
DBMS_XMLDOM.APPENDCHILD (
L_SUPP_NAME_NODE,
DBMS_XMLDOM.MAKENODE (L_SUPP_NAME_TEXT)
);
END LOOP;
L_XMLTYPE := DBMS_XMLDOM.GETXMLTYPE (L_DOMDOC);
DBMS_XMLDOM.FREEDOCUMENT (L_DOMDOC);
DBMS_OUTPUT.PUT_LINE (L_XMLTYPE.GETCLOBVAL);
END;
Output:
<tag_one>
<user>
<two>something</two>
<three>else</three>
<group_tag>
<secondGoup>
<five>123</five>
<six>014</six>
</secondGoup>
<secondGoup>
<five>456</five>
<six>011</six>
</secondGoup>
<secondGoup>
<five>789</five>
<six>011</six>
</secondGoup>
<secondGoup>
<five>012</five>
<six>011</six>
</secondGoup>
<secondGoup>
<five>345</five>
<six>011</six>
</secondGoup>
<secondGoup>
<five>678</five>
<six>011</six>
</secondGoup>
<secondGoup>
<five>901</five>
<six>011</six>
</secondGoup>
<secondGoup>
<five>234</five>
<six>011</six>
</secondGoup>
<secondGoup>
<five>567</five>
<six>011</six>
</secondGoup>
</group_tag>
</user>
</tag_one>