Tampilkan postingan dengan label PLSQL. Tampilkan semua postingan
Tampilkan postingan dengan label PLSQL. Tampilkan semua postingan

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.

Selengkapnya...

ANOMALI XML GENERATOR ORACLE

Kemarin team Nirwana ke SPC lagi untuk menyelesaikan tahap sinkronisasi. Seperti biasa, aku bertugas untuk membantu mba Ita menyelesaikan aplikasi Generate XML dari data spasial yang disimpan pada database Oracle. Jika kemarin menggunakan sys_xmlgen() untuk menghasilkan xml dari satu kolom. Maka kali ini, saya mencoba menggenerate seluruh kolom menjadi XML. Hal ini tidak bisa dilakukan dengan menggunakan sys_xmlgen(). Oleh karena itu, saya buat file batch untuk mengeksekusi query xml generator. Berikut ini file batch dan query-nya.

save.bat

sqlplus spasial/spasial@orcl @D:ariobatchquery.sql

query.sql

set linesize 1060;
set pagesize 1000;
set long 1000 ;
set heading off;
set serveroutput off;
set feedback off;
declare
coba clob;
begin
coba:= DBMS_XMLQuery.GetXML('select * from JALAN where ROWID in (SELECT M_ROW$$ FROM MLOG$_JALAN)');
dbms_output.put_line(coba);
end;
/
set serveroutput on;
spool D:xmlxml_JALAN26022008-194859.xml
/
spool off

dan inilah salah satu contoh file XML yang dihasilkan:

 <?xml version = '1.0'?>

<ROWSET>

<ROW num="1">

  <KD_PRO>31</KD_PRO>

  <KD_KAB>71</KD_KAB>

  <KD_KCM>010</KD_KCM>

  <KD_KLH>001</KD_KLH>

  <ID_JLN>31</ID_JLN>

  <NM_JLN>GG.BUNTU</NM_JLN>

  <LOG>Ok1</LOG>

  <MI_PRINX>31</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.77790008</SDO_ORDINATES_ITEM>

        <SDO_ORDINATES_ITEM>-6.27282198</SDO_ORDINATES_ITEM>

        <SDO_ORDINATES_ITEM>106.77790296</SDO_ORDINATES_ITEM>

        <SDO_ORDINATES_ITEM>-6.27280398</SDO_ORDINATES_ITEM>

        <SDO_ORDINATES_ITEM>106.77791088</SDO_ORDINATES_ITEM>                        

        <SDO_ORDINATES_ITEM>-6.27255504</SDO_ORDINATES_ITEM>

        <SDO_ORDINATES_ITEM>106.77791484</SDO_ORDINATES_ITEM>

        <SDO_ORDINATES_ITEM>-6.27239304</SDO_ORDINATES_ITEM>

     </SDO_ORDINATES>

  </GEOLOC>

</ROW>

</ROWSET>

Disinilah letak anomaly dari generator XML-nya Oracle. Jika dibandingkan dengan XML hasil dari sys_xmlgen(), maka dapat dilihat adanya perbedaan. Berikut ini hasil sys_xmlgen().

Query: Select sys_xmlgen(geoloc) from jalan where rownum=1;

<?xml version="1.0"?> <GEOLOC> <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.77938004</NUMBER> <NUMBER>-6.27357996</NUMBER> <NUMBER>106.77938112</NUMBER> <NUMBER>-6.27353496</NUMBER> <NUMBER>106.77938292</NUMBER> <NUMBER>-6.27340302</NUMBER> <NUMBER>106.77938292</NUMBER> <NUMBER>-6.27322896</NUMBER> <NUMBER>106.77938292</NUMBER> <NUMBER>-6.27312897</NUMBER> </SDO_ORDINATES> </GEOLOC>

Jika dilihat ada perbedaan format XML yang dihasilkan, hal ini mungkin dapat menyebabkan konsistensi format XML tidak dapat dipertahankan. Mungkin ada yang ingin memberi pencerahan??

Selengkapnya...

GENERATE XML DARI TABEL SPASIAL

Barusan bantu mba Ita lagi untuk generate tipe data sdo_geometry ke xml. Sebagai info, sdo_geometry adalah tipe data buatan pada Oracle 10G untuk menampung data spasial. Sdo_geometry ini merupakan objek yang didalamnya terdapat beberapa variabel-variabel seperti keterangan proyeksi, koordinat dan yang lainnya. Tadi sempat kebingungan bagaimana format XML dari sdo_geometry ini. Daripada pusink mikir, aku coba generate pake sys_xmlgen().

SQL> select sys_xmlgen(geoloc) from jakarta where rownum=1;

"geoloc" disini adalah nama kolom yang memiliki tipe data sdo_geometry, sedangkan "jakarta" adalah nama tabelnya. namun ketika di sqlplus, xml yang muncul hanya sebagian. sepertinya sqlplus-nya harus ada yang disetting lagi.

SQL> set long 10000

SQL> set linesize 10000

SQL>set pagesize 100

dari command promptnya sepertinya juga harus disetting. klik kanan properties, klik tab "layout" lalu perbesar nilai screen buffer size width ke 10000.

akhirnya berhasil keluar semua format xml-nya di sqlplus.

<?xml version="1.0"?> <GEOLOC> <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.77938004</NUMBER> <NUMBER>-6.27357996</NUMBER> <NUMBER>106.77938112</NUMBER> <NUMBER>-6.27353496</NUMBER> <NUMBER>106.77938292</NUMBER> <NUMBER>-6.27340302</NUMBER> <NUMBER>106.77938292</NUMBER> <NUMBER>-6.27322896</NUMBER> <NUMBER>106.77938292</NUMBER> <NUMBER>-6.27312897</NUMBER> </SDO_ORDINATES> </GEOLOC>
Selengkapnya...

Syntax Untuk Mengecek Primary Key

Gimana cara ngecek kolom apa aja yang jadi primary key di suatu tabel? Masalah ini yang ketemu waktu bantuin mba Ita bikin aplikasi convert data ke XML. Sempet bikin bingung juga neh, yang aku tau seh cara ngecek constraint lewat user_constraint. Tapi buat ngecek kolom apa aja yang jadi primary key, wah masih belum tau syntax nya gimana.. Ya udah daripada bingung-bingung nanya ke millist indo-oracle aja. Eh barusan dapet jawaban yang ditunggu-tunggu dari millist. Dan inilah solusi dari Wira Bisma salah satu anggota millist..

INI QUERY UNTUK MENCARI KOLOM YANG DIGUNAKAN SEBAGAI PRIMARY KEY DALAM SATU TABEL PADA SEMUA TABEL DALAM SATU SCHEMA.

DALAM HAL INI SCHEMA SCOTT :

SQL> CONNECT SCOTT/TIGER Connected. SQL> COL TABLE_NAME FOR A15 SQL> COL COLUMN_NAME FOR A15 SQL> SELECT A.TABLE_NAME, 2 A.COLUMN_NAME, 3 B.CONSTRAINT_TYPE, 4 B.CONSTRAINT_NAME 5 FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B 6 WHERE A.TABLE_NAME= B.TABLE_NAME 7 AND A.CONSTRAINT_NAME=B.CONSTRAINT_NAME 8 AND B.CONSTRAINT_TYPE='P';

TABLE_NAME COLUMN_NAME C CONSTRAINT_NAME ----------- ---------- - ---------- DEPT DEPTNO P PK_DEPT EMP EMPNO P PK_EMP

Selengkapnya...

Membuat Banyak TABLESPACES

Pada project datacenter spasial, telah direncanakan untuk membangun sekitar 660 tablespace untuk menampung data dan index. Untuk mempermudah, syntax create tablespace telah dimasukkan kedalam sebuah script sehingga dapat jalan secara otomatis. Namun ditengah eksekusi script tersebut, terjadi error. Ternyata error tersebut disebabkan karena nilai parameter db_files yang aktif lebih kecil daripada jumlah tablespace yang akan dicreate. Supaya semua tablespace dapat dicreate, maka db_file perlu diperbesar.

SQL> alter system set db_files=1000 scope=spfile;

Scope yang bisa dipakai untuk mengubah db_files ini hanya bisa memakai scope=spfile. Karena jika memakai scope both atau memory akan terjadi error “ERROR at line 1: ORA-02095: specified initialization parameter cannot be modified”.

Setelah mengubah nilai db_files tersebut, database perlu di-restart.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 251661188 bytes
Database Buffers 352321536 bytes
Redo Buffers 7135232 bytes
Database mounted.
Database opened.
SQL> show parameter db_files


NAME TYPE VALUE ------------------------------------ ----------- ------------------ db_files integer 1000

Lalu jalankan script create tablespace yang sebelumnya.. n walla.. semua tablespace telah ter-create….^o^

Peringatan: pada oracle 10G nilai db_files tidak boleh lebih besar dari 65534, soalnya oracle 10g cuma dukung paling banyak 65534 db_files. Tapi bisa juga tergantung OS nya..klo di unix coba periksa pake ulimit -a.

Selengkapnya...