Entries Categorized as 'Oracle'

Manipulasi Variabel PL/SQL pada Oracle Heterogeneous System

Date June 26, 2008

Oracle Heterogeneous System. Saya singkat Oracle HS biar enak nulisnya. Apa itu? Oracle HS adalah sistem yang memungkinkan untuk melakukan manipulasi database lain di luar sistem databse yang sedang dihubungi. Sistem lain itu bisa merupakan database Oracle, atau database non-Oracle, misalnya SQL Server atau bahkan MySQL.

Dengan pengaturan sistem Oracle HS ini, kita bisa melakukan query SQL pada database lain tersebut pada session Oracle kita. Misalnya kita ingin fetch data pada suatu tabel di database lain, maka query-nya akan menjadi semacam ini:

SELECT * FROM rfq@hsmsql

Ada penambahan @hsmsql yang menunjukkan database link Oracle HS yang telah di set-up sebelumnya (setup Oracle HS tidak dibahas pada posting ini).

Nah, masalah terjadi ketika Oracle HS digunakan di dalam script PL/SQL. Oracle HS tidak bisa membaca maupun mengisi variabel-variabel PL/SQL. Perhatikan query-query PL/SQL berikut ini:

SELECT Count( * ) INTO v_count FROM rfq@hsmsql

SELECT * FROM rfq@hsmsql WHERE rfqnum = v_rfqnum

Di query biasa tanpa Oracle HS, query di atas bisa berjalan dengan baik. v_count akan berisi jumlah row yang didapat dari tabel rfq, sedangkan query kedua akan terfilter khusus untuk baris yang memiliki rfqnum sama dengan v_rfqnum. Tapi di Oracle HS tidak. Oracle HS tidak dapat memasukkan jumlah Count( * ) ke dalam variabel v_count dan tidak dapat memfilter record rfqnum dengan isi variabel  v_rfqnum.

Solusinya, kita bisa menggunakan mekanisme yang dinamakan Passthrough-SQL. Ada package built-in dari Oracle yang bernama DBMS_HS_PASSTHROUGH yang khusus digunakan untuk mendapatkan data dan/atau sebaliknya dari/ke Oracle HS. Berikut ini adalah cara untuk mendapatkan hasil dari Oracle HS dan disimpan pada variabel PL/SQL

con := DBMS_HS_PASSTHROUGH.open_cursor@hsmsql.world;

DBMS_HS_PASSTHROUGH.parse@hsmsql.world (con,

‘SELECT COUNT( * ) FROM rfq_mxm
WHERE rfqnum = ”’
|| vrfq.rfqnum
|| ””
);

rs := DBMS_HS_PASSTHROUGH.fetch_row@hsmsql.world (con);

DBMS_HS_PASSTHROUGH.get_value@hsmsql.world (con, 1, vcount);

DBMS_OUTPUT.put_line (’count: ‘ || vcount);

Jika kode di atas dijelaskan secara konseptual, maka langkah-langkahnya adalah sebagai berikut:

  1. Buka kursor HS (pengertian kursor di sini berbeda dengan pengertian PL/SQL cursor)
  2. Query dengan fungsi parse
  3. Tarik hasil setiap baris dan masukkan ke dalam variabel PL/SQL dengan fungsi get_value

Memang jauh lebih rumit, tetapi inilah cara yang paling aman untuk memanipulasi variabel-variabel PL/SQL dengan sistem heterogeneous (Oracle HS).

Artikel terkait:

SQL Tuning: Klausa EXISTS versus IN

Date December 17, 2007

Masih mengenai masalah performance tuning pada Oracle SQL Query. Dalam kasus correlated subquery, kita biasa menggunakan IN dan NOT IN. Misalnya

SELECT * FROM tabel1 a
WHERE a.kolom1 NOT IN
( SELECT b.kolom1 FROM tabel2 b)

Dalam kasus yang sama, kita juga bisa menggunakan klausa EXISTS dan NOT EXISTS. Misalnya

SELECT * FROM tabel1 a
WHERE a.kolom1 NOT EXISTS
( SELECT b.kolom1 FROM tabel2 b)

Apa beda dua statement SQL ini? Klausa IN dan NOT IN memeriksa apakah sebuah nilai terdapat dalam list (bisa array, bisa correlated subquery seperti contoh di atas) sedangkan klausa EXISTS dan NOT EXISTS hanya memeriksa keberadaan ada atau tidaknya row pada suatu list. Secara performance, tentu jauh lebih cepat EXISTS daripada IN dalam hal correlated subquery.

Kapan kita menggunakan IN? Sebisa mungkin, gunakan EXISTS, IN digunakan dalam hal seperti misalnya contoh di bawah ini:

SELECT * FROM tabel1 a
WHERE a.kolom1 IN (’1′, ‘2′, ‘3′)

SQL Tuning: Fungsi String di Klausa WHERE

Date December 11, 2007

Ini adalah Oracle SQL Performance Tuning tips and trick dari Mas FF. Katakanlah kita punya SQL seperti ini,

SELECT *
FROM tabel t
WHERE LOWER(t.kol)
LIKE ‘%hehe%’ AND SUBSTR(t.kol2,2,4) = ‘AB’

Terlihat familiar? Ini memang query standar kok. Tapi apakah Anda tahu implikasi fungsi LOWER dan SUBSTR di masalah kecepatan? Ternyata proses LOWER dan SUBSTR adalah me-lower-case-kan seluruh baris di kolom t.kol tersebut dan men-substring-kan seluruh baris di kolom t.kol2 sebelum membandingkannya dengan hehe dan AB. Jika jumlah barisnya terlalu banyak, tentu saja akan terjadi degradasi kecepatan yang sangat berarti (baca: signifikan).

Solusi: Gunakan fungsi-fungsi semacam LOWER dan SUBSTR secara bijak. Jika sudah yakin suatu kolom dalam lowercase, maka input sebelah kanan (dalam hal ini hehe) harus diubah ke lowercase juga. Demikian pula untuk fungsi SUBSTR.

Demikian tips dan trik singkat SQL Tuning. :D

Administrasi Oracle Container 4 J2EE

Date February 23, 2007

Oracle memiliki application server yang handal bernama Oracle Application Server yang sebenarnya roh di dalamnya adalah Orion Application Server. OAS merupakan application server yang lengkap dan kokoh, mendukung servlet hingga webservice. OAS sendiri merupakan produk komersial yang mahal, namun servlet containernya yang populer disebut Oracle Container for J2EE (OC4J) didistribusikan dengan free.

Nah, kali ini aku berhasil menyusun dokumentasi semacam “getting started” yang membahas bagaimana melakukan administrasi awal OC4J. Versi mayor OC4J yang kubahas adalah versi 10.1.2.x, kompatibel dengan spesifikasi J2EE 1.3, meskipun versi mayor terbaru adalah 10.1.3.x yang kompatibel dengan J2EE 1.4. Sebabnya adalah adanya bug yang sangat menjengkelkan pada OC4J 10.1.3 sehingga membuat aplikasi gabungan maut webwork+hibernate+spring menjadi tidak berjalan semestinya.

File-nya dapat didownload di link di bawah ini, maaf menggunakan format Microsoft Word karena tidak punya Adobe PDF creator. Terima kasih untuk Mas Aby yang mengkoreksi dokumentasi ini.

Silakan, ini lho link-nyah!! :)