Day 23: Menyimpan XML di XML DB Repository Data

Learning In HomeOriginal Date: 4 Februari 2009

Jika sebelumnya aku menyimpan XML di dalam tabel dengan menggunakan tipe data XMLType, maka hari ini aku akan mencoba menyimpan XML ke dalam repository XML DB (tanpa melalui tabel database). Di dalam repository tersebut, aku mengakses data dalam struktur tree folder seolah-olah mengakses file yang tersimpan di harddisk. Sebenarnya data di repository juga disimpan sebagai kumpulan tabel dan index di dalam schema database Oracle. Salah satu view yang berguna untuk mengetahui informasi repository melalui SQL adalah RESOURCE_VIEW dan PATH_VIEW.

Aku dapat mengakses repository melalui protokol FTP, HTTP, dan WebDav. Pengaturan untuk protokol-protokol tersebut terdapat di xdbconfig.xml yang terletak di root. Untuk melihat isi file xdbconfig.xml pada node yang aku inginkan, aku dapat memberikan query SQL berikut:


SELECT xmltype(extract(res, '/Resource/Contents/*').getClobVal()).extract('/xdbconfig/sysconfig/protocolconfig') FROM RESOURCE_VIEW
WHERE ANY_PATH = '/xdbconfig.xml';

Pengaturan untuk protokol FTP dapat dilihat di /xdbconfig/sysconfig/protocolconfig/ftpconfig. Secara default, ftp port yang dipakai adalah 2100 . Pengaturan untuk protokol HTTP dapat dilihat di /xdbconfig/sysconfig/protocolconfig/httpconfig. Secara default, http port yang dipakai adalah 8080.

Untuk melihat isi repository melalui Internet Exploper, aku tinggal mengetikkan link berikut:


http://localhost:8080

kemudian mengisi username dan password sesuai dengan user database Oracle. Untuk melakukan modifikasi terhadap repository, aku dapat menggunakan WebDAV, yaitu dengan men-klik Add Network Place di My Network Places, kemudian mengisi lokasi dengan http://localhost:8080. Setelah itu, aku bisa men-browse repository dengan Windows Explorer, serta melakukan operasi copy paste, layaknya file di harddisk.

Iklan

Day 22: Memakai Tipe Data XMLType Melalui JDBC

Learning In HomeOriginal Date: 3 Februari 2009

Hari ini aku akan melakukan latihan bagaimana membaca tipe data XMLType dari program Java. Untuk itu, aku membutuhkan class oracle.xdb.XMLType yang terletak di %ORACLE_HOME%\rdbms\jlib\xdb.jar. Setelah itu, aku dapat memberikan kode untuk mengambil nilai XMLType, seperti berikut:


rs.next();
XMLType dataXML = 
  (XMLType) rs.getObject(1);
System.out.println(
  dataXML.getStringVal());

Untuk menambahkan record baru yang berisi data XML dalam bentuk XMLType, aku dapat menggunakan kode program seperti berikut ini:


OraclePreparedStatement ps = 
  (OraclePreparedStatement) 
  cn.prepareStatement(
  "INSERT INTO TBL_XML 
   (DATA_ID, DATA_XML) 
   VALUES (?,?)");
ps.setString(1, "ACC99");
XMLType xmlType = new XMLType(cn, 
  "<account id='acc99'><debet>

   <tanggal>01/02/2009</tanggal>
   <jumlah>1000</jumlah></debet>
   </account>");
ps.setObject(2, xmlType);
ps.execute();

Untuk men-update data XML, misalnya aku ingin mengubah record yang dibuat di atas dengan nilai elemen jumlah yang semula bernilai 1000 menjadi 2000, aku dapat menggunakan cara yang sama, misalnya seperti berikut:


XMLType dataXML = 
 (XMLType) rs.getObject(1);
Document doc = dataXML.getDOM();
 Element eAccount = 
doc.getDocumentElement();
 Element eDebet = (Element) 
eAccount.getFirstChild();
 Element eJumlah = (Element) 
eDebet.getLastChild();		
eJumlah.getFirstChild().
 setNodeValue("2000");
			
dataXML = new XMLType(cn, doc);
OraclePreparedStatement ps = 
 (OraclePreparedStatement) 
 cn.prepareStatement("UPDATE TBL_XML 
  SET DATA_XML = ? 
  WHERE DATA_ID = 'ACC99'");
ps.setObject(1, dataXML);
ps.execute();
rs.close();
ps.close();

Day 21: Membuat XML dari Data Relational

Learning In HomeOriginal Date: 2 Februari 2009

Untuk menghasilkan data XML dari data relational, aku menggunakan fungsi xmlElement(), xmlAttributes(), xmlForest(), dan xmlAgg().

Sebagai contoh, query berikut:


SELECT xmlElement("karyawan", xmlElement("nama",null,ENAME)) FROM EMP;

akan menghasilkan baris yang seperti berikut ini:


<karyawan><nama>scott</nama></karyawan>

Cara lain untuk mengubah sebuah tabel menjadi data XML adalah dengan menggunakan dbUriType(), seperti pada contoh berikut:


SELECT dbUriType('/SCOTT/EMP').getXML() FROM DUAL;

yang akan menghasilkan XML seperti pada contoh berikut:

<?xml version="1.0"?>
<EMP>
  <ROW>
     <EMPNO>7782</EMPNO>
     <ENAME>CLARK</ENAME>

     ...
  </ROW>
  ...
</EMP>

Day 20: Oracle XML DB

Learning In HomeOriginal Date: 1 Februari 2009

Jika sebelumnya aku mempelajari bagaimana menggunakan Oracle XDK untuk memanipulasi data XML, sekarang aku akan melihat bagaimana menyimpan dan mengelola data XML di dalam database Oracle melalui Oracle XML DB. Kolom yang berisi XML yang dikelola Oracle XML DB menggunakan tipe data XMLType. Kolom yang bertipe XMLType tersebut juga dapat di-validasi atau diberi constraints berdasarkan XML Schema tertentu.

Sebagai latihan, misalnya, aku membuat sebuah tabel sebagai berikut:


CREATE TABLE TBL_XML (
  DATA_ID CHAR(10),
  DATA_XML XMLTYPE
);

Untuk memasukkan data XML ke dalam tabel tersebut, aku terlebih dahulu mempersiapkan sebuah file XML dan object directory yang merujuk ke lokasi penyimpanan file tersebut. Setelah itu, aku bisa menjalankan query berikut:


INSERT INTO TBL_XML VALUES ('ACC1', XMLType(bfilename('DIR_XML', 'Account.xml'), nls_charset_id('AL32UTF8')));

Pada contoh diatas, DIR_XML adalah nama object directory yang merujuk ke directory yang mengandung file XML Account.xml. Untuk melihat isi dari kolom XML, aku dapat menggunakan perintah SELECT biasa seperti:


SELECT DATA_XML FROM TBL_XML WHERE DATA_ID = 'ACC1';

Untuk mendapatkan node tertentu saja, aku dapat menggunakan fungsi extract(), seperti:


SELECT extract(DATA_XML, '/hibernate-mapping/class/id') FROM TBL_XML;

Pada contoh di atas, aku hanya akan mendapat nilai untuk element id saja. Untuk mendapatkan nilai attribute dan nilai isi teks, aku dapat menggunakan fungsi extractValue(), seperti:


SELECT extractValue(DATA_XML, '/hibernate-mapping/class/property[1]/@name') FROM TBL_XML;

Pada contoh di atas, aku mengambil nilai atribut name milik elemen property yang pertama (index 1). Untuk menguji keberadaan suatu node, aku dapat menggunakan existsNode(), seperti pada contoh berikut:


SELECT extractValue(DATA_XML, '/hibernate-mapping/class/@table') FROM TBL_XML
WHERE existsNode(DATA_XML, '/hibernate-mapping/class/subclass') = 1;

Pada contoh di atas, aku akan menampilkan nilai atribut table milik elemen class untuk seluruh XML yang elemen class-nya mengandung elemen subclass. Contoh lain yang masih menggunakan existsNode(), misalnya, untuk menampilkan atribut name dari class yang memiliki element property dimana atribut column-nya bernilai NUMBER(5,2):


SELECT extract(DATA_XML, '/hibernate-mapping/class/@name') FROM TBL_XML WHERE
existsNode(DATA_XML, '/hibernate-mapping/class/property/column[@sql-type="NUMBER(5,2)"]') = 1;

Untuk meng-update salah satu node di data bertipe XMLType, aku dapat menggunakan fungsi updateXML seperti pada contoh berikut:


UPDATE TBL_XML SET DATA_XML = updateXML(DATA_XML, '/hibernate-mapping/class/id/column/@name', 'CLS_ID') WHERE DATA_ID = 'ACC1';

Untuk men-update elemen dimana elemen tersebut tercantum lebih dari satu kali, aku harus menentukan elemen mana yang akan dihapus. Sebagai contoh, sebuah elemen class dapat mengandung banyak elemen property. Aku dapat mengubah atribut name milik property yang nilainya amount menjadi amt dengan query berikut:


UPDATE TBL_XML SET DATA_XML = updateXML(DATA_XML, '/hibernate-mapping/class/property[@name="amount"]/@name', 'amt') WHERE DATA_ID = 'ACC1';