Manipulasi Variabel PL/SQL pada Oracle Heterogeneous System

Posted by: on Jun 26, 2008 | 6 Comments

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:

6 Comments

  1. cinker
    June 26, 2008

    sangat membantu sekali…………..tapi masalahnya saya emang dasarnya nanit…jg kurang ngerti……he2

    btw thx buat ilmunya

    Reply
  2. Galih Satria
    June 27, 2008

    #cinker:
    nggak juga kok, memang postingan ini lebih ke catatan pribadi saja :D

    Reply
  3. Donny Reza
    June 27, 2008

    Heu heu heu, jadi nostalgia sama PL/SQL :) )

    Reply
  4. abdulmuneverlose
    June 27, 2008

    wah, dulu pas basis data lanjut juga diajarin mas. tapi antara Oracle sama Ms Access, blm pernah coba yg oracle-mysql .. nice info nih :)

    Reply
  5. pine
    January 23, 2009

    Mo nanya, kalo misalnya nama kolom yang dibandingkan dalam kondisi WHERE itu apa bisa ambil dari parameter yach.
    Misalnya gini :

    Select * from data
    where pkolom = pdata;

    krn kolomnya bs ganti2 jadi dijadikan parameter.
    Saya coba ga error, tp ga ada data yg tampil.
    mgkn prnh ngalamin yg kayak gini??

    Reply
  6. jhlala
    June 17, 2009

    iya sy jg pernah sering mngalami data kosong. pdhl notificationsnya tidak menunjukkan error. sy coba mnggbungkan 2 tbl dgn yg idx berbeda jmlh stringnya jd sy menggunkan cmmnd substr, hal tsb jd tp stlh select nama dari 2 tbl tersebut data yg ditampilkan kosong..

    Reply

Leave a Reply

Switch to our mobile site