Master-details query to XML file?
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