Neuronworks Blog, WebMethods, Oracle, Bea, Java Dev2Dev, Arch2Arch Neuronworks Make IT Easy, Let's Play the Game » Oracle

Archive

Archive for the ‘Oracle’ Category

Create MD5 function di Oracle

January 23rd, 2009

Suatu ketika saya ada keperluan menggunakan fungsi MD5 di oracle. karena mencari-cari fungsi built in di oracle tidak ketemu, atau mungkin tidak ada akhirnya saya memutuskan untuk membuat Java Store Procedure. Untuk mempelajari lebih detail langkah-langkah membuat java store procedure anda bisa melihat postingan sebelumnya Java Store Procedure .

Langkah pertama membuat fungsi md5 di java

import java.security.MessageDigest;
 
public class MD5 {
 
    public static String getMD5(String message) {
 
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            String md5string="";
            StringBuffer sb = new StringBuffer();
            byte buf[] = message.getBytes();
            byte[] md5 = md.digest(buf);
            System.out.println(message);
            for( int i = 0 ; i < md5.length ; i++ ) {
                String tmpStr = "0"+Integer.toHexString( (0xff & md5[i]));
                sb.append(tmpStr.substring(tmpStr.length()-2));
            }
            md5string = sb.toString();
            return (md5string);
        }
        catch (Exception e)
        {
            System.out.println(e);
            return "0";
        }
    }
}

Kemudian kita compile

#javac MD5.java

Jika tidak ada error akan menghasilkan MD5.class, kemudian kit aload ke oracle

 loadjava -resolve -user scott/tiger MD5.class

Publish fungsi Java Store Procedure dengan membuat interface di oracle :

CREATE OR REPLACE FUNCTION GetMD5(str in varchar) RETURN VARCHAR2
as LANGUAGE JAVA
NAME 'MD5.getMD5(java.lang.String) return java.lang.String';

kemudian kita coba

select GetMD5('gatotkaca') from dual;
 
GETMD5('gatotkaca')
============================
4495ca9b8bb44554754c5ed33a33fef9

selamat mencoba !!!

semua script yang ada pada halaman ini bisa anda download di sini

Java, Oracle ,

Java Store Procedure

January 23rd, 2009

Mulai dari Oracle versi 8i oracle menyediakan membuat Java Store Procedure didalam database. Java Store Procedure biasa digunakan untuk membangung fungsi-fungsi yang tidak disediakan di oracle atau utilitas yang mungkin lebih efisien dan mudah dikerjakan menggunakan pemrograman Java. Untuk mengetahui apakah database kita sudah bisa kita gunakan untuk membuat Java Store Procedure kita bis amengecek dengan sintak sebagai berikut :

 SQL> describe dbms_java

jika perintah diatas memberikan pesan error seperti :

ERROR:
  ORA-04043: object dbms_java does not exist

artinya Package DBMS_JAVA belum terinstall di database kita, solusinya kita harus menginstall package tersebut yang sudah disediakan oleh oracle

#sqlplus / as sysdba
SQL>  
   @$ORACLE_HOME/javavm/install/initjvm.sql;
   @$ORACLE_HOME/xdk/admin/initxml.sql;
   @$ORACLE_HOME/xdk/admin/xmlja.sql;
   @$ORACLE_HOME/javavm/install/init_jis.sql $ORACLE_HOME;
   @$ORACLE_HOME/javavm/install/jisaephc.sql $ORACLE_HOME;
   @$ORACLE_HOME/javavm/install/jisja.sql $ORACLE_HOME;
   @$ORACLE_HOME/javavm/install/jisdr.sql 2481 2482;
   @$ORACLE_HOME/jsp/install/initjsp.sql;
   @$ORACLE_HOME/jsp/install/jspja.sql;
   @$ORACLE_HOME/rdbms/admin/initjms.sql;
   @$ORACLE_HOME/rdbms/admin/initrapi.sql;
   @$ORACLE_HOME/rdbms/admin/initsoxx.sql;
   @$ORACLE_HOME/rdbms/admin/initapcx.sql;
   @$ORACLE_HOME/rdbms/admin/initcdc.sql;
   @$ORACLE_HOME/rdbms/admin/initqsma.sql;
   @$ORACLE_HOME/rdbms/admin/initsjty.sql;
   @$ORACLE_HOME/rdbms/admin/initaqhp.sql;

Jika semua environment sudah terinstall dan siap kita akan membuat Java Store Procedure, berikut langkah-langkahnya :

  1. Membuat Java Class
  2. Kita ingin membuat fungsi Hello World

            public class PrintHello{
                  public static String Print(String name) {
                          return "Hello My Name "+name;
                 }
           }
    </pre > 
     
    Compile Script diatas 
     
    <pre lang="java">
    javac PrintHello.java
    </pre >
     
            <li>Load dan Resolve Java Class ke Oracle</li>
       Java class sudah berhasil dihasilkan akan kia load masuk ke database dengan menggunakan utilitas yang sudah disediakan oleh oracle yaitu loadjava     
    <pre lang="bash">
    # loadjava
    loadjava: Usage: loadjava [-definer] [-encoding encoding] [-force] [-genmissing] [-genmissingjar jar] [-grant grants] [-help] [-nousage] [-noverify] [-oci8] [-order] [-resolve] [-resolver resolver] [-schema schema] [-synonym] [-thin] [-tableschema schema] [-user user/password@database] [-verbose] classes..jars..resources..properties...

    Untuk kasus diatas kita gunakan option sederhana seperti berikut :

    loadjava -user scott/tiger PrintHello.class
    
  3. Publish Java Class
  4. untuk setiap java class kita harus membuatkan fungsi atau procedure sesuai dengan definisi java class.

    SQL>
    CREATE OR REPLACE FUNCTION PrintHello(name in varchar2) RETURN VARCHAR2
    as LANGUAGE JAVA
    NAME 'PrintHello.Print(java.lang.String) return java.lang.String';

  5. Panggil Store Procedure
  6. Kita coba panggil hasil fungsi di oracle

    SQL> select PrintHello('Gatotkaca') from dual;
    

Java, Oracle ,

SqlPlus dengan History di Linux

January 6th, 2009

Paling frustasi kalau pake sqlplus, sudah ketik syntax panjang-panjang, waktu dieksekusi ada yang salah, ngetik lagi deh dari awal. Soalnya tidak ada history buat command yang sudah dijalankan. Tidak bisa diedit lagi command yang sudah kita ketik. Solusinya cuma di backspace. :D
Tapi tenang saja, ada solusinya agar sqlplus juga punya kemampuan buat menyimpan history command, seperti Shell Bash di Linux. Yang kita perlukan hanyalah sebuah aplikasi yang bernama rlwrap.
Install dulu rlwrap untuk operating system anda. Dalam contoh ini yang digunakan adalah openSUSE 10.3 yang bisa didapatkan dari http://download.opensuse.org/repositories/openSUSE:/10.3/standard/i586/rlwrap-0.28-27.i586.rpm.
Setelah diinstal kita tinggal menjalankan perintah rlwrap dengan parameternya yaitu sqlplus:

oracle@NeuronServer:~> rlwrap sqlplus

Sqlplus yang terbuka akan memiliki kemampuan menyimpan history command dan line editing sederhana. Gunakan tombol panah atas dan bawah untuk mengakses perintah yang sudah kita jalankan. Kita juga bisa mengedit perintah itu dengan menggeser kursor menggunakan tombol panah kanan dan kiri. Agar konfigurasi rlwrap tadi terus dijalankan setiap login kita gunakan saja fungsi alias dari shell agar setiap kali sqlplus dijalankan yang dipanggil adalah perintah rlwrap dengan parameter sqplus-nya. Buka file .bash_profile yang ada di direktori home user oracle atau user yang dapat menjalankan perintah sqlplus:

oracle@NeuronServer:~> vi ~/.bash_profile

dan tambahkan baris berikut:

alias sqlplus='rlwrap sqlplus'

Cara lainnya dengan menjalankan perintah echo yang menambahkan baris diatas langsung di baris terakhir file .bash_profile:

oracle@NeuronServer:~> echo "alias sqlplus='rlwrap sqlplus'" >> ~/.bash_profile

Semoga bermanfaat and have a lot of fun!

Linux, Oracle , , , , , ,

Oracle Cursor dan Ref Cursor

January 6th, 2009

Definisi Cursor
Dalam blok PL/SQL tidak mengijinkan kita membuat query yang menghasilkan lebih dari satu baris untuk ditampung dalam sebuah variabel. Variabel semacam ini dinamakan cursor.
Kegunaan

  1. Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris
  2. Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record

Macam2 Cursor
Cursor : cursor eksplisit dan cursor implisit

  • Cursor Eksplisit : Cursor yang harus dideklarasikan terlebih dahulu sebelum digunakan
  • Contoh :

     DECLARE
        CURSOR c_nama IS
        SELECT nama_petugas FROM pegawai ORDER BY nama_petugas ASC;
        v_nama PETUGAS.nama_petugas%TYPE; /**%TYPE agar tipe data variabel v_nama sama dengan kolom nama_petugas?*/
    BEGIN
        FOR X IN c_nama
        LOOP
          DBMS_OUTPUT.PUT_LINE (c_nama%ROWCOUNT ||'Daftar Nama Petugas : ' || x.nama_petugas);
        END LOOP;
    END;
  • Cursor Implisit : Cursor yang tidak perlu dideklarasikan dulu pada declare section. contoh cursor implisit diasosiasikan dengan perintah SELECT, INSERT, DELETE, dan UPDATE
    Contoh :

    DECLARE
      id VARCHAR2(10);
      vnama_petugas PETUGAS.nama_petugas%TYPE;
    BEGIN
      id := 'PG-010'; //assigment value
      SELECT nama_petugas INTO vnama_petugas FROM PETUGAS WHERE id_petugas = id;
      IF SQL%NOTFOUND THEN
         DBMS_OUTPUT.PUT_LINE('Data ditemukan');
      ELSE
         DBMS_OUTPUT.PUT_LINE ('Nama petugas dengan id : ' || id || 'adalah ' || vnama_petugas);
      END IF;
    END;

Ref Cursor
Kita dapat menggunakan ref cursor untuk mengembalikan nilai dalam bentuk recordset/cursor di store procedure.
Ada 2 tipe ref cursor :

  1. Strong ref cursor : tipe data dan panjangnya harus diketahui saat compile
  2. Weak ref cursor : tipe data dan panjangnya tidak dibutuhkan saat compile

Contoh :

 declare
  type r_cursor IS REF CURSOR;
  c_emp r_cursor;
  en emp%rowtype;
begin
  open c_emp FOR SELECT * FROM emp;
  loop
      fetch c_emp INTO en;
      exit when c_emp%notfound;
      dbms_output.put_line(c_emp%rowcount ||'. '||en.nama);
  end loop;
  close c_emp;
end;
 declare
  type r_cursor IS REF CURSOR;
  c_emp r_cursor;
  en emp%rowtype;
begin
  open c_emp FOR SELECT * FROM emp;
  loop
      fetch c_emp INTO en;
      exit when c_emp%notfound;
      dbms_output.put_line(c_emp%rowcount ||'. '||en.nama);
  end loop;
  close c_emp;
end;

Menggunakan ref cursor di dalam loop
Contoh :

declare
  type r_cursor IS REF CURSOR;
  c_emp r_cursor;
  type rec_emp IS record
  (
    deptno  varchar2(20),
    nama   number(6)
  );
  er rec_emp;
begin
  FOR i IN (SELECT deptno,lokasi FROM location)
  loop
    open c_emp FOR SELECT * FROM emp WHERE deptno = i.deptno;
    dbms_output.put_line(i.lokasi);
    dbms_output.put_line('--------------');
    loop
      fetch c_emp INTO er;
      exit when c_emp%notfound;
      dbms_output.put_line(er.name || ' - ' || er.sal);
    end loop;
    close c_emp;
  end loop;
end;

pada variabel ‘i’ tersedia informasi pada tabel location (deptno, lokasi).
Persamaan dan perbedaan antara cursor dan ref cursor :
Persamaan :

  1. Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris
  2. Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record

Perbedaan :

  1. Sebuah ref cursor dapat diasosiasikan dengan lebih dari 1 klausa SELECT saat run-time. Sebelum klausa SELECT baru, cursor sebelumnya harus ditutup dulu.

Oracle , ,

Membackup Schema Oracle Secara Otomatis

January 5th, 2009

The Intro

Sebelumnya kita sudah mencoba membackup schema oracle menggunakan exp. Kita bisa memanfaatkannya untuk membuat sebuah sistem penjadwalan yang secara otomatis membackup schema tersebut pada waktu yang telah ditentukan. Tool yang digunakan selain Shell dan exp juga crontab. Crontab merupakan aplikasi penjadwalan di mesin Unix dan Linux. Crontab bekerja sebagai daemon atau service cron yang setiap waktu akan mengecek apakah ada job atau tugas yang harus dilakukan pada waktu itu. Crontab menyimpan entri untuk setiap penjadwalan seperti ini:

* * * * * /home/alam/someScript.sh

Kolom pertama menunjukan menit dimana entri tersebut akan dijalankan. Kolom kedua untuk jam, kolom ketiga untuk tanggal, kolom keempat untuk bulan, kolom kelima untuk untuk hari, dan kolom terakhir menunjukan perintah apa yang akan dijalankan. Dari contoh diatas berarti setiap menit, setiap hari, setiap bulan cron akan menjalankan script tersebut.
Pertama-tama kita buat dulu script sederhana, train-backup.sh yang berfungsi untuk membackup schema tersebut. Script tersebut akan membackup schema-nya di directory yang sudah ditentukan dengan nama file yang berbeda berdasarkan kapan schema tersebut dibackup.

The Script

#!/bin/sh
#script to backup oracle schema based on time when it saved
#initializing variables
export PATH=$PATH:/app/oracle/product/10.2/bin
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/10.2
export ORACLE_SID=neuron
export BASEDIR=$HOME/train-backup
export DTM=`date +%Y%m%d-%H%M%S`
export UNAME=train
export PASSWD=train
export FILENAME=train
 
# command section
cd $BASEDIR
exp $UNAME/$PASSWD file=$FILENAME-$DTM.dmp
 
exit

Jangan lupa beri execute permission dengan:

alam@NeuronServer:~&gt; chmod +x train-backup.sh

Script-nya cukup sederhana kan? Yang perlu dilakukan hanyalah inisialisasi variabel:

export PATH=$PATH:/app/oracle/product/10.2/bin
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/10.2
export ORACLE_SID=neuron
export BASEDIR=$HOME/train-backup
export DTM=`date +%Y%m%d-%H%M%S`
export UNAME=train
export PASSWD=train
export FILENAME=train

dan perintah backup itu sendiri:

cd $BASEDIR
exp $UNAME/$PASSWD file=$FILENAME-$DTM.dmp

Untuk sedikit memahami dasar dari shell scripting silakan lihat kembali postingan sebelumnya.
Yang mungkin perlu diperhatikan adalah variabel DTM yang akan menyimpan format waktu untuk digunakan di nama filenya. Variabel DTM menyimpan hasil output dari perintah date yang akan menampilkan waktu saat itu dengan format YYYYMMDD-HH:MI:SS. Untuk lebih jelasnya coba jalankan perintah date tersebut di command line:

alam@NeuronServer:~&gt; date +%Y%m%d-%H%M%S
20090105-201620

Variabel ini akan kita tambahkan di nama file backup schema-nya untuk membedakan satu file dengan yang lain.

The Cron

Sekarang kita masuk ke bagian cron-nya sendiri. Kita tentukan kapan saja backup akan dilakukan. Misal kita ingin backup dilakukan setiap jam 12 malam setiap hari Senin dan Jum’at. Entri crontab-nya seperti ini:

* 00 * * 1,5 /home/alam/train-backup.sh

Untuk memasukkan entri diatas gunakan perintah crontab -e. Editor vi akan terbuka. Untuk masuk ke mode insert tekan tombol i. Ketikkan atau paste entri yang tadi kita buat. Untuk menyimpannya tekan tombol Esc, dilanjutkan dengan tombol :, dilanjutkan dengan tombol x, yang berarti menyimpan sekaligus keluar dari vi.
Untuk melihat apakah penjadwalan tersebut sudah masuk gunakan perintah crontab -l:

alam@NeuronServer:~&gt; crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.XXXXLhlmgJ installed on Mon Jan  5 20:28:21 2009)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
* 00 * * 1,5 /home/alam/train-backup.sh

The… End?

Selesai! Untuk melihat berhasil atau tidaknya kita lihat lagi besok apakah file backup schema-nya sudah ada atau tidak. :)

The Update

Coba kita lihat hasilnya:

alam@NeuronServer:~> ll train-backup
total 0

Lho kok tidak ada? Ayo kita cek script-nya dengan cara dijalankan langsung:

alam@NeuronServer:~> ./train-backup.sh 
./train-backup.sh: line 16: exp: command not found

Hm? PATH-nya kan sudah masuk mestinya? Coba kita export dan tes lagi satu-satu variabelnya:

alam@NeuronServer:~> export ORACLE_BASE=/app/oracle
alam@NeuronServer:~> cd $ORACLE_BASE
alam@NeuronServer:/app/oracle> export ORACLE_HOME=/app/oracle/product/10.2
alam@NeuronServer:/app/oracle> cd $ORACLE_HOME
-bash: cd: /app/oracle/product/10.2: Permission denied

Ini dia masalahnya. User alam tidak punya permission untuk masuk ke direktori /app/oracle/product:

alam@NeuronServer:/app/oracle> ll /app/oracle/
total 20
drwxr-x--- 3 oracle oinstall 4096 2008-11-22 17:08 admin
drwxr-x--- 3 oracle oinstall 4096 2008-11-22 17:09 flash_recovery_area
drwxr-x--- 3 oracle oinstall 4096 2008-11-22 17:08 oradata
drwxrwx--- 6 oracle oinstall 4096 2008-11-22 17:07 oraInventory
drwxrwx--- 3 oracle oinstall 4096 2008-11-22 00:07 product

Jadi bagaimana solusinya? Kita jalankan script tersebut sebagai user yang punya permission untuk mengakses direktori tersebut, yaitu oracle:

oracle@NeuronServer:~> mkdir train-backup
oracle@NeuronServer:~> /home/alam/train-backup.sh 
 
Export: Release 10.2.0.1.0 - Production on Tue Jan 6 14:59:42 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user TRAIN 
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user TRAIN 
About to export TRAIN's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export TRAIN's tables via Conventional Path ...
. . exporting table                          TRAIN          2 rows exported
EXP-00091: Exporting questionable statistics.
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully with warnings.
oracle@NeuronServer:~> ll train-backup
total 16
-rw-r--r-- 1 oracle oinstall 16384 2009-01-06 14:59 train-20090106-145942.dmp

Jadi masukkan cron job-nya yang tadi untuk user oracle dengan crontab -e juga.
Dan crontab yang di user alam dihapus saja:

alam@NeuronServer:~> crontab -r
alam@NeuronServer:~> crontab -l
no crontab for alam

Sekarang sudah pasti berhasil.

Semoga bermanfaat and have a lot of fun!

Linux, Oracle , , , , ,