Minggu, 09 Januari 2011

STORED PROGRAM

Procedure

Non Nested Procedure

Non nested Procedure atau stored procedure merupakan sekumpulan blok PL/SQL  yang  tersimpan di dalam skema database dan dapat dieksekusi secara berulang kali jika user memiliki privilege untuk mengeksekusi procedure tersebut. Nama procedure yang dibuat nantinya akan menjadi objek dengan tipe procedure. Procedure akan dieksekusi pada saat pemanggilan setelah sebelumnya dibuat terlebih dahulu.

Sintaks Pendeklarasian:
CREATE [OR REPLACE] PROCEDURE nama_procedure
[argumen1 tipe_data,
argumen2 tipe_data,...]
AS
[deklarasi variabel lokal]   
BEGIN
badan_prosedur   
EXCEPTION
END;


Keterangan
nama_procedure       : nama dari procedure yang akan dibuat
argumen                  : parameter-parameter yang dipakai saat pemanggilan procedure
badan_prosedur        : tempat blok PL/SQL yang memuat baris kode.

Contoh :
CREATE OR REPLACE PROCEDURE tambahMahasiswa
(
      v_nim       mahasiswa.nim%type;
      v_nama      mahasiswa.nama%type;
      v_alamat    departemen.lokasi%type
)

IS
BEGIN
insert into mahasiswa values(v_nim,v_nama,v_alamat);
END;


Setelah procedure dibuat, dijalankan dengan sintaks berikut.

EXECUTE
nama_procedure(parameter_1,parameter_2,...);

Contoh :
EXECUTE tambahMahasiswa
(‘30108002’,‘paimen’,‘sukapura’);


Untuk menghapus procedure yang telah kita buat, dapat menggunakan sintaks berikut

DROP PROCEDURE nama_procedure



Contoh :
DROP PROCEDURE tambahMahasiswa;

Nested Procedure

Adalah procedure yang dideklarasikan di dalam Declaration Section suatu blok PL/SQL yang anonim. Karena dideklarasikan di dalam blok PL/SQL yang anonim maka nested procedure tidak disimpan dalam basis data dan tidak dapat dijalankan oleh blok lain kecuali dideklarasikan kembali oleh blok tersebut.

Contoh :
DECLARE    
  PROCEDURE CETAK(kata varchar2, n number) IS
BEGIN
        FOR i IN 1..n LOOP
            DBMS_OUTPUT.PUT_LINE(to_char(i)||
’. ‘||kata);
        END LOOP;
      END CETAK;

BEGIN
      CETAK(‘&v_kata’, &v_n); 
END;



JENIS-JENIS PROCEDURE PADA ORACLE :

PROCEDURE TANPA PARAMETER/ARGUMEN
Procedure yang tidak memiliki parameter/argument biasanya bersifat statis (outputannya selalu sama) setiap kali dieksekusi.

Contoh:
CREATE OR REPLACE PROCEDURE lihat_mahasiswa
IS
      vnama mahasiswa.nama%type;

BEGIN
SELECT nama INTO vnama FROM mahasiswa
WHERE nim = '30108002';
DBMS_OUTPUT.PUT_LINE('Nama mahasiswa dengan nim
30108002 adalah '||vnama);

END;
/




Hasil setelah dieksekusi adalah sbb,

SQL> EXECUTE lihat_mahasiswa;

Nama mahasiswa dengan nim 30108002 adalah paimen

Procedure lihat_mahasiswa di atas bersifat statis, dieksekusi kapanpun memiliki output yang sama.

PROCEDURE DENGAN PARAMETER/ARGUMEN
Perbedaan dengan procedure tanpa parameter yaitu procedure dengan parameter memiliki output yang dinamis sesuai dengan nilai yang diberi pada parameter procedure tersebut. Default argumen pada Oracle adalah IN.

Jenis-Jenis parameter/argumen dari Procedure adalah :
Parameter Masukan (Input)
Ditandai dengan atribut IN, dimana nilai dari parameter ini merupakan inputan untuk sebuah procedure.

Contoh:
CREATE OR REPLACE PROCEDURE lihat_mahasiswa
(vnim IN mahasiswa.nim%type)

IS
      vnama mahasiswa.nama%type;

BEGIN
SELECT nama INTO vnama FROM mahasiswa
WHERE nim = vnim;
DBMS_OUTPUT.PUT_LINE('Nama mahasiswa dengan nim
'||vnim||' adalah '||vnama);

END;
/



Parameter Keluaran (Output)
Ditandai dengan atribut OUT, dimana parameter ini merupakan variabel penampung untuk output sebuah procedure.

Contoh:

Procedure yang menggunakan parameter masukan dan juga  parameter keluaran adalah sebagai berikut :
CREATE OR REPLACE PROCEDURE lihat_mahasiswa
(vnim IN mahasiswa.nim%type,
vnama OUT mahasiswa.nama%type)

IS
BEGIN
SELECT nama INTO vnama FROM mahasiswa
WHERE nim = vnim;
DBMS_OUTPUT.PUT_LINE('Nama mahasiswa dengan nim
'||vnim||' adalah '||vnama);

END;
/













Untuk mengeksekusi procedure lihat_mahasiswa :

SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
  2  vnama mahasiswa.nama%type;
  3  BEGIN
  4        lihat_mahasiswa ('30108002',vnama);
  5        DBMS_OUTPUT.PUT_LINE('Nama mahasiswa teladan bulan ini adalah  '||vnama);
  6  END;
  7  /
Nama mahasiswa teladan bulan ini adalah paimen

Parameter Masukan/Keluaran (Input/Output)
Ditandai atribut IN OUT, dimana parameter tersebut dianggap sebagai masukan kemudian diproses dan ditampilkan kembali sebagai keluaran.

Contoh:
CREATE OR REPLACE PROCEDURE kuadrat
(x IN OUT number)

IS
BEGIN
x:=x*x;

END;
/













Untuk mengeksekusi procedure kuadrat :

SQL> SET VERIFY OFF;
SQL> DECLARE
  2  bil number := '&input_angka';
  3  n number;
  4  BEGIN
  5        n := bil; 
  6        kuadrat(bil);
  7        DBMS_OUTPUT.PUT_LINE('kuadrat dari '||n||' adalah '||bil);
  8  END;
  9  /
Enter value for input_angka : 5
kuadrat dari 5 adalah 25

 

Function

Perbedaan mendasar antara function dan procedure adalah bahwa function harus mengembalikan nilai tertentu kepada pemanggilnya. Nilai ini dikembalikan dengan menggunakan sintaks RETURN.

Non Nested Function

Disebut juga stored function yang mirip dengan stored procedure tetapi harus memberikak output sebuah nilai. Function ini tersimpan dalam basis data.

Sintaks:
CREATE [OR REPLACE] FUNCTION nama_function
[(argumen [IN|OUT|IN OUT] tipe_data,
  argumen [IN|OUT|IN OUT]tipe_data,
  ...)]
RETURN tipe_data {IS|AS}
[deklarasi variabel lokal]   

BEGIN
badan fungsi     
END;


RETURN adalah nilai yang dikembalikan oleh function. Jika terdapat RETURN dalam badan fungsi, maka itu berfungsi untuk mengembalikan kontrol kepada pemanggil fungsi bersama nilai yang dikembalikan fungsi.

Sintaks:
RETURN ekspresi;



Dalam satu fungsi dimungkinkan penggunaan RETURN yang lebih dari satu tetapi bila di dalam badan fungsi tidak terdapat pernyataan RETURN maka akan terjadi error.

Contoh:
CREATE OR REPLACE FUNCTION tambah
(n1 number, n2 number)
RETURN number IS

BEGIN
      return (n1+n2);
END;



Cara mengeksekusi :
SQL > select tambah (1,8) from dual;

tambah (1,8)
- - - - - - - - - - -
                    9









Contoh :
CREATE OR REPLACE FUNCTION cariMahasiswa
(vnim mahasiswa.nim%type)
RETURN number IS
      v_nim mahasiswa.nim%type;

BEGIN
SELECT nim FROM mahasiswa WHERE nim = vnim;
IF SQL%FOUND THEN
      RETURN 1;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
      RETURN 0;

END cariPegawai;



Contoh pemanggilan fungsi:
declare
begin
   IF(cariMahasiswa('30108002') = 1) THEN;
dbms_output.put_line('mahasiswa terdaftar');
   ELSE
      dbms_output.put_line('mahasiswa tidak terdaftar');
   END IF;
end;


Untuk meng-compile ulang sebuah function digunakan sintaks berikut
ALTER FUNCTION nama_fungsi COMPILE;



Sedangkan untuk menghapus funsi digunakan sintaks berikut
DROP FUNCTION nama_fungsi;



Nested Function


Seperti nested procedure, fungsi ini adalah fungsi yang dideklarasikan dalam suatu blok PL/SQL, tidak tersimpan dalam basis data dana hanya bisa dipanggil oleh blok dimana fungsi dideklarasikan.

Contoh:
DECLARE
      jum number;
      FUNCTION tambah(n1 number, n2 number)
      RETURN number IS
      BEGIN
            RETURN(n1+n2);
      END tambah;
BEGIN
      jum:=tambah(2,3);
dbms_output.put_line('Hasil penjumlahan antara 2 dan 3 adalah  '||TO_CHAR(jum));
END;


JENIS-JENIS FUNCTION :

1.     FUNCTION TANPA PARAMETER
Function ini tidak memiliki parameter/argumen biasanya
bersifat statis  setiap kali dieksekusi.
Contoh :
DECLARE
           
      FUNCTION jumMahasiswa
      RETURN number IS
      jum number;
      BEGIN
         select count(nim) into jum from mahasiswa;
         RETURN(jum);
      END jumMahasiswa;
BEGIN
dbms_output.put_line('Jumlah mahasiswa saat ini adalah '||TO_CHAR(jumMahasiswa));
END;




2.     FUNCTION BER-PARAMETER
Sama seperti Procedure berparameter, Function ber-parameter memiliki outputan yang dinamis sesuai dengan nilai yang diassign ke parameter pada function tersebut. Adapun parameter yang dimaksud disini adalah :

a.     Parameter masukan
Contoh :
CREATE OR REPLACE FUNCTION luas_persegi_panjang
(p number,l number)
RETURN number
IS

BEGIN
RETURN (p*l);
END;



Salah satu cara untuk mengeksekusinya dengan menggunakan klausa SELECT sepertidi bawah ini :

SQL> SELECT luas_persegi_panjang (8,3) FROM dual;

LUAS_PERSEGI_PANJANG(8,3)
------------------------------------------
                       24


b.     Parameter keluaran
Contoh :
CREATE OR REPLACE FUNCTION volume_tabung
(r IN number, t IN number,luas OUT number)
RETURN number IS
   pi number:=3.14;
   vol number;

BEGIN
luas:=pi*r*r;
return (luas*t);
END;



Misal digunakan blok PL/SQL untuk menjalankan fungsi diatas :
declare
L_alas number;

begin
dbms_output.put_line('Volume tabung paijo adalah '||volume_tabung(2,5,L_alas));
dbms_output.put_line('Luas alas lingkaran pada tabung paijo adalah '||L_alas);
end;




Output :

Volume tabung paijo adalah  62.8
Luas alas lingkaran pada tabung paijo adalah 12.56

Contoh di atas menunjukan bahwa function dapat mengembalikan lebih dari satu nilai lewat parameter OUT.

c.     Parameter masukan/keluaran
Contoh :

CREATE OR REPLACE FUNCTION volume_tabung_ku
(x IN OUT number, t IN number)
RETURN number IS
 pi number:=3.14;
 vol number;

BEGIN
      x:=pi*x*x;
      vol:= x*t;
return (vol);
END;


digunakan blok PL/SQL berikut untuk menjalankan fungsi diatas :
declare
y number:='&jari_alas';

begin
dbms_output.put_line('Volume tabung paimen adalah '||volume_tabung2(y,5));
dbms_output.put_line('Luas alas lingkaran tabung paimen adalah '||y);
end;



Output :

Enter value for jari_alas: 2
old   2: L number:='&jari_alas';
new   2: L number:='2';
Volume tabung paimen adalah 62.8
Luas alas lingkaran tabung paimen adalah 12.56

Tidak ada komentar:

Posting Komentar