Skip to Main Content

DevOps, CI/CD and Automation

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Master-details query to XML file?

Saad NayefAug 30 2008 — edited Sep 6 2008
Hi:
I'm new in XML and Oracle. I want to create XML file from two tables (master-details).
I made a small serach and tried some examples:
Say we have these tables:
CREATE TABLE "TEST_XML"
( "ID" NUMBER,
"NAME" VARCHAR2(15),
"AMOUNT" NUMBER,
CONSTRAINT "TEST_XML_PK" PRIMARY KEY ("ID") ENABLE
)
/


CREATE TABLE "TEST_XML2"
( "ID2" NUMBER,
"NAME2" VARCHAR2(20),
"AMOUNT2" NUMBER
)
/
ALTER TABLE "TEST_XML2" ADD CONSTRAINT "TEST_XML2_FK" FOREIGN KEY ("ID2")
REFERENCES "TEST_XML" ("ID") ENABLE
/

INSERT INTO TEST_XML VALUES (1,'A',50);
INSERT INTO TEST_XML VALUES (2,'B',30);
INSERT INTO TEST_XML VALUES (3,'C',70);

INSERT INTO TEST_XML2 VALUES (1,'AA',10);
INSERT INTO TEST_XML2 VALUES (1,'AB',20);
INSERT INTO TEST_XML2 VALUES (1,'AC',20);
INSERT INTO TEST_XML2 VALUES (2,'BA',10);
INSERT INTO TEST_XML2 VALUES (2,'BB',20);
INSERT INTO TEST_XML2 VALUES (3,'CA',20);
INSERT INTO TEST_XML2 VALUES (3,'CB',40);
INSERT INTO TEST_XML2 VALUES (3,'CC',10);

I want a query to create XML file contains data from TEST_XML table and for each row the related data from TEST_XML2 table.

I did some tries (working in iSQL*PLUS):
SET SERVEROUTPUT ON
DECLARE
v_ctx DBMS_XMLGEN.ctxType;
v_file Utl_File.File_Type;
v_xml CLOB;
v_more BOOLEAN := TRUE;
BEGIN
-- Create XML document from query.
v_ctx := DBMS_XMLGEN.newContext('select id,name,amount,cursor (select id2,name2,amount2 from test_xml2 t2 where t2.id2=t1.id) val from test_xml t1');
DBMS_XMLGEN.setMaxRows(v_ctx, 10);
DBMS_XMLGEN.setRowsetTag(v_ctx, 'CLAIM');

-- Output XML document to file.
v_file := Utl_File.FOpen('TEST_DIR', 'test1.xml', 'w');
WHILE v_more
LOOP
v_xml := DBMS_XMLGEN.GetXML(v_ctx,0);
EXIT WHEN dbms_xmlgen.getNumRowsProcessed(v_ctx) =0;
Utl_File.Put(v_file,v_xml);
END LOOP;
Utl_File.FClose(v_file);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,255));
Utl_File.FClose(v_file);
END;
/

But hte output wasn't as I wanted:
<CLAIM>
<ROW>
<ID>1</ID>
<NAME>A</NAME>
<AMOUNT>50</AMOUNT>
<VAL>
<VAL_ROW>
<ID2>1</ID2>
<NAME2>AA</NAME2>
<AMOUNT2>10</AMOUNT2>
</VAL_ROW>
<VAL_ROW>
<ID2>1</ID2>
<NAME2>AB</NAME2>
<AMOUNT2>20</AMOUNT2>
</VAL_ROW>
<VAL_ROW>
<ID2>1</ID2>
<NAME2>AC</NAME2>
<AMOUNT2>20</AMOUNT2>
</VAL_ROW>
</VAL>
</ROW>
<ROW>
<ID>3</ID>
<NAME>C</NAME>
<AMOUNT>70</AMOUNT>
<VAL>
<VAL_ROW>
<ID2>3</ID2>
<NAME2>CA</NAME2>
<AMOUNT2>20</AMOUNT2>
</VAL_ROW>
<VAL_ROW>
<ID2>3</ID2>
<NAME2>CB</NAME2>
<AMOUNT2>40</AMOUNT2>
</VAL_ROW>
<VAL_ROW>
<ID2>3</ID2>
<NAME2>CC</NAME2>
<AMOUNT2>10</AMOUNT2>
</VAL_ROW>
</VAL>
</ROW>
<ROW>
<ID>2</ID>
<NAME>B</NAME>
<AMOUNT>30</AMOUNT>
<VAL>
<VAL_ROW>
<ID2>2</ID2>
<NAME2>BA</NAME2>
<AMOUNT2>10</AMOUNT2>
</VAL_ROW>
<VAL_ROW>
<ID2>2</ID2>
<NAME2>BB</NAME2>
<AMOUNT2>20</AMOUNT2>
</VAL_ROW>
</VAL>
</ROW>
</CLAIM>

Notice that for each details (from TEST_XML2) there is <VAL> tag which I don't need beside i want a query which is applicable on all environments.

May anyone help me please......

Regards,

Saad
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Oct 4 2008
Added on Aug 30 2008
5 comments
3,344 views