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';

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: