GENERATE XML DENGAN XMLELEMENT

Pada posting generate xml sebelumnya, saya memakai dbms_xmlquery untuk generate xml. Namun setelah ditinjau lebih jauh.. ternyata ada beberapa keterbatasan.. dimana bila ingin menyatukan dua query menjadi satu file xml akan terjadi error.

Query1.sql

set linesize 1060;

set pagesize 1000;

set long 1000 ;

set heading off;

set serveroutput off;

set feedback off;

declare

queryCtx1 DBMS_XMLquery.ctxType;

queryCtx2 DBMS_XMLquery.ctxType;

coba clob;

coba1 clob;

begin

queryCtx1 := DBMS_XMLQuery.newContext('select ID_JALAN, LOG, MI_PRINX, GEOLOC from JALAN where ROWID in (select M_ROW$$ from MLOG$_JALAN)');

queryCtx2 := DBMS_XMLQuery.newContext('select mi_prinx from MLOG$_JALAN where dmltype$$=''D''');

coba:= DBMS_XMLQuery.GetXML(queryCtx1);

coba1:= DBMS_XMLQuery.GetXML(queryCtx2);

dbms_output.put_line(coba);

dbms_output.put_line(coba1);

end;

/

set serveroutput on;

spool D:\xml\xml_JALAN11032008-144351.xml

/

spool off

file xml yang dihasilkan dari script diatas adalah..

xml_JALAN11032008-144351.xml

<?xml version = '1.0'?> <ROWSET> <ROW num="1"> <ID_JALAN>28</ID_JALAN> <LOG>Ok1</LOG> <MI_PRINX>28</MI_PRINX> <GEOLOC> <SDO_GTYPE>2002</SDO_GTYPE> <SDO_SRID>8307</SDO_SRID> <SDO_POINT> <X>0</X> <Y>0</Y> </SDO_POINT> <SDO_ELEM_INFO> <SDO_ELEM_INFO_ITEM>1</SDO_ELEM_INFO_ITEM> <SDO_ELEM_INFO_ITEM>2</SDO_ELEM_INFO_ITEM> <SDO_ELEM_INFO_ITEM>1</SDO_ELEM_INFO_ITEM> </SDO_ELEM_INFO> <SDO_ORDINATES> <SDO_ORDINATES_ITEM>106.77932388</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>-6.27297003</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>106.77934296</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>-6.27295104</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>106.77948696</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>-6.27294798</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>106.77949596</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>-6.27293403</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>106.77948984</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>-6.27274602</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>106.77945312</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>-6.272748</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>106.77945204</SDO_ORDINATES_ITEM> <SDO_ORDINATES_ITEM>-6.27260904</SDO_ORDINATES_ITEM> </SDO_ORDINATES> </GEOLOC> </ROW> </ROWSET> <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <MI_PRINX>27</MI_PRINX> </ROW> </ROWSET>

Jika dilihat pada bagian yang ditandai dengan warna merah, maka terlihat letak kesalahan yang dihasilkan. Adanya <?xml version = '1.0'?> kedua menyebabkan error pada file xml. Oleh karena itu, untuk mengatasi permasalahan diatas maka saya menggunakan cara yang agak brutal pada query yang menggunakan xmlelement() sebagai generator xml-nya.

Query2.sql

set linesize 1060;

set pagesize 1000;

set long 2000 ;

set heading off;

set serveroutput on;

set feedback off;

begin

dbms_output.put_line('');

end;

/

spool D:\ario\batch2\coba.xml

/

spool off

select q'[]' from dual;

spool D:\ario\batch2\coba.xml app

/

spool off

select ''||' U '|| xmlelement("ID_JALAN",ID_JALAN)||' '||xmlelement("NM_JALAN",NM_JALAN)||' '||xmlelement("LOG",LOG)||' '||xmlelement("MI_STYLE",MI_STYLE)||' '||xmlelement("MI_PRINX",MI_PRINX)||' '||xmlelement("GEOLOC",GEOLOC)||' '||'' from JALAN where ROWID in (SELECT M_ROW$$ FROM MLOG$_JALAN);

spool D:\ario\batch2\coba.xml app

/

spool off

select ''||' D '||xmlelement("MI_PRINX",mi_prinx)||' '||' ' from MLOG$_JALAN where dmltype$$='D';

spool D:\ario\batch2\coba.xml app

/

spool off

select q'[]' from dual;

spool D:\ario\batch2\coba.xml app

/

spool off

file xml yang dihasilkan adalah sebagai berikut

coba.xml

<?xml version = '1.0'?> <ROWSET> <ROW> <DMLTYPE>U</DMLTYPE> <ID_JALAN>28</ID_JALAN> <NM_JALAN></NM_JALAN> <LOG>Ok1</LOG> <MI_STYLE></MI_STYLE> <MI_PRINX>28</MI_PRINX> <GEOLOC> <SDO_GEOMETRY> <SDO_GTYPE>2002</SDO_GTYPE> <SDO_SRID>8307</SDO_SRID> <SDO_POINT><X>0</X><Y>0</Y></SDO_POINT> <SDO_ELEM_INFO> <NUMBER>1</NUMBER> <NUMBER>2</NUMBER> <NUMBER>1</NUMBER> </SDO_ELEM_INFO> <SDO_ORDINATES> <NUMBER>106.77932388</NUMBER> <NUMBER>-6.27297003</NUMBER> <NUMBER>106.77934296</NUMBER> <NUMBER>-6.27295104</NUMBER> <NUMBER>106.77948696</NUMBER> <NUMBER>-6.27294798</NUMBER> <NUMBER>106.77949596</NUMBER> <NUMBER>-6.27293403</NUMBER> <NUMBER>106.77948984</NUMBER> <NUMBER>-6.27274602</NUMBER> <NUMBER>106.77945312</NUMBER> <NUMBER>-6.272748</NUMBER> <NUMBER>106.77945204</NUMBER> <NUMBER>-6.27260904</NUMBER> </SDO_ORDINATES> </SDO_GEOMETRY> </GEOLOC> </ROW> <ROW> <DMLTYPE>U</DMLTYPE> <ID_JALAN>30</ID_JALAN> <NM_JALAN></NM_JALAN> <LOG>Ok1</LOG> <MI_STYLE></MI_STYLE> <MI_PRINX>30</MI_PRINX> <GEOLOC> <SDO_GEOMETRY> <SDO_GTYPE>2002</SDO_GTYPE> <SDO_SRID>8307</SDO_SRID> <SDO_POINT><X>0</X><Y>0</Y></SDO_POINT> <SDO_ELEM_INFO> <NUMBER>1</NUMBER> <NUMBER>2</NUMBER> <NUMBER>1</NUMBER> </SDO_ELEM_INFO> <SDO_ORDINATES> <NUMBER>106.77797388</NUMBER> <NUMBER>-6.27359499</NUMBER> <NUMBER>106.77798</NUMBER> <NUMBER>-6.27357096</NUMBER> <NUMBER>106.77798108</NUMBER> <NUMBER>-6.27318297</NUMBER> </SDO_ORDINATES> </SDO_GEOMETRY> </GEOLOC> </ROW> <ROW> <DMLTYPE>D</DMLTYPE> <MI_PRINX>27</MI_PRINX> </ROW> </ROWSET>

Untuk menghasilkan baris pertama xml yaitu tulisan <?xml version = '1.0'?> digunakan dbms_output.put_line() dalam procedure agar xml yang dihasilkan tidak error ketika ditampilkan pada browser firefox. Karena jika menggunakan perintah select biasa untuk menghasilkan tulisan <?xml version = '1.0'?> file xml akan error ketika dibuka dengan browser firefox karena adanya satu baris kosong di baris pertama file xml. Selain itu settingan long juga harus diperbesar menjadi 2000, karena query2.sql menghasilkan satu row xml memanjang trus ke samping tanpa ada karakter new line sebagai separator antar kolom.

0 komentar: