Showing posts with label Database. Show all posts
Showing posts with label Database. Show all posts

Monday, April 28, 2008

ORA-29280 ?

pernah suatu ketika pada waktu bermain-main dengan file di PL/SQl menemui error seperti ini :
ORA-29280: invalid directory
apa maksudnya? error ini menunjukan bahwa function FOPEN yang kita panggil dari package UTL_FILE tidak menemukan adanya directory dengan alamat yang sudah kita definisikan di paramater dari function FOPEN.
Nah disini yang menarik,..... ada beberapa perbedaan isi dari parameter location yang ada di FOPEN tersebut. Seperti kita ketahui bahwa FOPEN memiliki paramater

UTL_FILE.FOPEN (location IN VARCHAR2, filename IN VARCHAR2, open_mode IN VARCHAR2, max_linesize IN BINARY_INTEGER)

Pada oracle versi dibawah 9.2 terlebih dahulu kita harus mendefinisikan parameter location ini di file init.ora yaitu dengan menambahkan baris script berikut ini :
utl_file_dir=[directory path]
(untuk mendefinisikan directory lebih dari satu macam bisa ditambahkan beberapa script diatas sekaligus). Setelah itu di parameter location bisa kita isi directory yang kita definisikan tadi.

Namun ada perbedaan yang cukup signifikan ketika kita menggunakan oracle 9.2 ke atas.
Perbedaannya terletak pada parameter location. Pada Oracle 9.2 ke atas parameter location bukan berisi alamat directory explicit, akan tetapi berisi object directory yang harus kita definisikan dulu dengan menjalankan script di bawah :
create or replace directory as '[directory path]'
(syaratnya user harus mempunyai privilege create directory, kalau ndak ya pakai aja login system dengan privilege sysdba)
Nah setelah itu baru kita kasih hak akses terhadap object directory tersebut
GRANT READ|WRITE ON DIRECTORY  TO PUBLIC|[another user];

Object directory inilah yang nantinya akan kita jadikan sebagai parameter location pada waktu kita memanggil fungsi FOPEN.
Well then.. selamat mencoba :)



Friday, April 25, 2008

read/write file - PL/SQL version

Buat yang hobi bermain ORACLE atawa PL/SQL barangkali tips ini bisa membantu.
Di dalam script PL/SQL yang kita buat, bisa jadi tidak hanya tabel yang ada di dalam database saja yang kita akses untuk mendapatkan atau menyimpan data. Seperti halnya bahasa pemrograman yang lain, adakalanya kita membutuhkan akses file yang ada di luar untuk mendapatkan data atau menyimpan suatu data.Secara default PL/SQL memang tidak menyediakan suatu prosedur khusus untuk menangani operasi file ini. Akan tetapi terdapat suatu package bawaan yang dinamakan UTL_FILE.
Di dalam package UTL_FILE ini disediakan sejumlah prosedur untuk menangani operasi file di dalam PL/SQL (kalau ndak salah sih mulai Oracle 7.3 sudah terdapat paket yang menangani file I/O). UTL_FILE ini akan mengakses suatu file melalui directory dan filename, yang terlebih dahulu harus kita definisikan. Berikut ini adalah langkah-langkah mendefinisikan directory dan filename tersebut:
  1. Buatlah suatu direktori dan sebuah file di delam direktori tersebut. Misal nama direktori di windows adalah D:\initial_ dan nama file-nya adalah orange.txt.
  2. Setelah itu lakukan inisialisasi parameter UTL_FILE_DIR di file init.ora. Pada file tersebut tambahkan script utl_file_dir=D:\initial_ Parameter inilah yang nantinya akan dibaca oleh prosedur FOPEN yang ada di dalam package UTL_FILE.
  3. Pastikan folder tersebut bisa diakses oleh user, baik itu akses read atau write.
  4. Untuk Oracle 9.2 ke atas, sebenarnya kita sudah tidak perlu repot menambahkan script di atas, karena sudah disediakan script khusus untuk membuat object directory. Object directory inilah yang nantinya akan diakses oleh prosedur yang ada di dalam UTL_FILE sebagai pengganti nama direktori sebenarnya. Berikut langkah-langkahnya :
    • Login pada Oracle dengan user system dan privilage sysdba.
    • Setelah itu jalankan script untuk membuat objek directory tertentu. Misal :
CREATE OR REPLACE DIRECTORY OUT_DIR AS 'D:\initial_'
Dimana OUT_DIR adalah nama dari objek directory sedangkan 'D:\initial_' adalah alamat dari direktori tersebut
    • Kemudian jalankan script untuk memberi akses tertentu pada object directory tersebut kepada suatu user.
GRANT WRITE ON DIRECTORY OUT_DIR TO SCOTT
Dimana OUT_DIR adalah nama object directory dan SCOTT adalah nama user schema
Setelah kita berhasil menciptakan object directory maka selanjutnya adalah membuat script sederhana untuk mengkases file-file yang ada di dalam direktori yang sudah kita definisikan. Pada contoh kali ini saya membuat suatu procedure dengan nama FILE_PROC. Procedure tersebut berisi sejumlah operasi file, yaitu FOPEN, PUTLINE, PUTF, dan FCLOSE

CREATE OR REPLACE PROCEDURE FILE_PROC AS
-- deklarasi variabel untuk menangkap file
v_FileHandle UTL_FILE.FILE_TYPE;
BEGIN
-- membuka file, dimana 'orange.txt' adalah nama sebuah file yang berada di
-- dalam direktori yang sudah kita definisikan di dalam object 'OUTDIR'
-- 'w' adalah open mode
-- 32767 adalah max line size
v_FileHandle := TL_FILE.FOPEN('OUT_DIR','orange.txt','w',32767);
UTL_FILE.PUT_LINE(v_FileHandle, 'This is line 1');
for v_count in 2..10 loop
UTL_FILE.PUTF(v_FileHandle,'This is line %s|\n',v_count);
end loop;
-- menutup file
UTL_FILE.FCLOSE(v_FileHandle);
END;
/

Referensi :
  • Urman, Scott, 2002. Oracle 9i PL/SQL Programming, McGraw-Hill/Osborn
  • http://www.experts-exchange.com/Databases/Oracle/Q_20984148.html
  • http://youngcow.net/doc/oracle10g/appdev.102/b14258/u_file.htm
  • http://www.adp-gmbh.ch/ora/plsql/utl_file.html
  • http://www.psoug.org/reference/utl_file.html

Wednesday, August 1, 2007

DISTRIBUTED DATABASE PART 3

Bismillah…….
Konfigurasi Heterogeneous
Seperti yang telah dibahas sebelumnya, bahwa dalam Heterogeneous Distributed Database terdiri dari berbagai jenis database dengan server pusat adalah server Oracle. Untuk menghubungkan server Oracle dengan server non-Oracle akan kita gunakan ODBC yang nantinya akan menghubungkan antara server Oracle melalui service agent HSODBC dengan server non-Oracle.
Pada contoh kali ini kita asusmsikan membuat database terdistribusi antara server Oracle dengan server mySQL.
Di bawah adalah langkah-langkah konfigurasi untuk Heterogeneous Distributed Database pada server Oracle. Konfigurasi ini dilakukan pada server oracle yang akan menjadi server utama :
  • Install ODBC driver, MYSQL Connector for ODBC pada server yang terinstal Oracle.
  • Buat koneksi Datasource ke MySQL server dengan ODBC tersebut. Contoh koneksi dengan nama MyODBC.
  • Konfigurasi file HS (init.ora) yang ada pada $ORACLE_HOME/hs/admin/
Contoh: pada file initmysqlodbc.ora
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = MyODBC
HS_FDS_TRACE_LEVEL = 0
  • Konfigurasi file listener.ora yang ada pada $ORACLE_HOME/network/admin/
(SID_DESC=
(SID_NAME=
mysqlodbc)
(ORACLE_HOME = $ORACLE_HOME)
(PROGRAM=hsodbc)
)
  • Konfigurasi file tnsname.ora yang ada pada $ORACLE_HOME/network/admin/
MYSQL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = [nama / IP server])(PORT = 1521))
(CONNECT_DATA =
(SID=mysqlodbc)
)
(HS=OK)
)
  • Setelah itu restart service TNSLISTENER
  • Kemudian buat database link
create [public] database link DB_LINK_MYSQL connected to “riset” identified by “riset” using ‘MYSQL’;
Yang perlu di perhatikan disini dalam pembuatan database link adalah penggunaan user dan password ‘riset’. Pada koneksi homogeneous (sesame oracle) kita tidak perlu memberi tanda petik ganda (“) karena pada oracle tidak case sensitive. Sedangkan pada koneksi heterogeneous perlu kita beri tanda petik ganda untuk menuliskan username dan password, karena pada database lain bersifat case sensitif
  • Setelah semuanya selesai lanjutkan dengan ujicoba query seperti pada contoh distribusi homogeneous.
Well, sampai disini tutorialnya….. Selamat mencoba…….

DISTRIBUTED DATABASE PART 2

Bismillah…..

Sedikit konsep sudah kita dapatkan dari bab sebelumnya….. lalu bagaimana konfigurasinya untuk membikin sistem kayak gini.
Ok akan kita lanjutkan, pada contoh konfigurasi kali ini kita akan menggunakan database Oracle sebagai server pusat distribusi (untuk database yang lain blum eksplorasi soalnya….:p).

Konfigurasi Homogenous

Untuk konfigurasi ini sangat simple sekali dilakukan… Misalnya kita akan membuat database terdistribusi seperti pada gambar di bawah. Sebelumnya pada server A dan server B diasumsikan sudah terdapat database dengan nama DB_A dan DB_B. Keduanya Memiliki user dan schema dengan nama ‘RISET’ dan memiliki password ‘RISET’ dan didalamnya memiliki sebuah tabel bernama ‘MAHAR’

Langkah-langkahnya adalah sebagai berikut:

  • Daftarkan nama service database oracle yang lain pada TNSNAME.ORA database server pusat.

[nama koneksi (terserah)] =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = [nama / IP server])(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = [nama database])
))
Pada lokasi: $ORACLE_HOME\server\NETWORK\ADMIN\tnsname.ora

  • Resrtart service TNSLISTENER yang ada pada daftar service-service.

  • Buat database link untuk kedua server tersebut

Syntax-nya kayak gini nih.

  • Untuk database link ke server A

create [public] database link DB_LINK_SERVERA connected to riset identified by riset using ‘DATABASE_A’;

  • Untuk database link server B

create [public] database link DB_LINK_SERVERB connected to riset identified by riset using ‘DATABASE_B’;

Pada syntax di atas dapat dilihat bahwa ada penggunaan kata ‘public’, apa maksudnya public disini? Public disini maksudnya adalah apakah database link tersebut bisa digunakan oleh user lain atau tidak. Kalau kita tambahkan ‘public’ berarti database link tersebut bisa digunakan oleh server yang lain. Sedangkan ‘DATABASE_A’ dan ‘DATABASE_B’ adalah nama koneksi service oracle lain yang sudah terdaftar dalam TNSNAME server pusat.

Username dan password untuk database link diletakan setelah ‘connected to’ dan ‘identified by’. Ingat Oracle tidak case sensitive, dan untuk menuliskan username dan password tidak perlu dimasukkan tanda pentik.

  • Cek database link.

Nah, selanjutnya bagaimana caranya mengecek apakah database link yang kita buat itu jalan atau nggak?? Caranya begini:
Jalankan query yang isinya melakukan select ke salah satu tabel yang ada di server lain yang terhubung dengan database link.

select * from [nama tabel]@[database link]

Contoh:

select * from MAHAR@[DB_LINK_SERVERA

Jika hasil dari query tersebut muncul dan tidak terjadi error, maka pembuatan database link tersebut berhasil dan kita dapat melakukan operasi query dan DML ke berbagai tabel yang ada pada server yang lain

Selamat mencoba……(to be continue………)
[Sumber: Oracle Documentation]

DISTRIBUTED DATABASE PART 1


Bismillah……

Well, let’s begin this lesson with a little concept…..
Apa itu distributed database atau yang lebih dikenal dengan istilah database terdistribusi….
Distributed database : adalah beberapa buah database yang tersimpan dalam beberapa buah computer tyang berbeda yang kesemuanya terintegrasi menjadi satu, sehingga suatu aplikasi hanya mengenal sebagai satu buah sistem database saja [Oracle Documentation].

Jadi gampangannya sih di sistem itu ada beberapa buah database…. ntah itu Oracle, MS. SQL Server, MS. Access, MySQL, atau lain sebagainya….. tapi client hanya mengetahui hanya satu buah sistem database di situ……
Database terdistribusi ini terdiri dari dua macam jika dilihat dari tipe database yang join dalam sistem ini:

  • Homogeneous Distributed DB
  • Heterogeneous Distributed DB

Kalo homogeneous berarti database yang terlibat sistem ini hanya satu macem aja. Sebaliknya kalo heterogeneous bisa macem-macem jenisnya.
Kebanyakan DBMS yang ada sekarang sudah banyak yang mendukung buat konfigurasi homogeneous sistem.
So, bagaimana dengan heterogeneous system,setahu saya sih yang biasa dipake buat heterogeneous system ini adalah Oracle. Kenapa kok pake oracle ya? Karena Oracle nih udah nyediain mekanisme buat koneksi ke database lain. Mekanisme ini ditangani oleh suatu agent yang namanya Heterogenous Service Agent, apa itu ?? gampangannya sih suatu service yang ada di dalam Oracle yang digunakan buat koneksi ke database yang lain (…. Untuk database yang lain masih belum tahu….belum eksplorasi soalnya… :p ).

Jadi model arsitekturnya kayak gini. Server Oracle akan bertindak sebagai database server yang akan diakses oleh aplikasi client. Sedangkan dabatase yang lain tersebut hanya bisa diakses melalui database Oracle tersebut…. Semakin bingung? Lihat gambar di atas.
Untuk membuat distributed database ini, yang paling utama adalah membuat database link. Apa itu database link.? Database link yaitu suatu konfigurasi dimana kita membuat link (koneksi) pada suatu database dengan database yang lain. Entah itu satu platform atau beda platform.

Apa sih keuntungannya kita pake sistem kayak gini?

  • Aplikasi client tidak langsung terhubung dengan database sumbernya
  • Aplikasi client tidak tahu lokasi asal data sebenernya
  • Lebih secure tentunya

Then, bagaimana konfigurasinya….?? Akan dilanjutkan ke part selanjutnya. :)
[Sumber: Oracle Documentation]