MODUL VI CONTOH KASUS
PERINTAH KONDISIONAL
PERINTAH KONDISIONAL
PL/SQL mempunyai perintah kondisional IF-THEN-ELSE. Sintaksnya adalah sebagai berikut :
IF ekspresi_boolean1 THEN
urutan_perintah1; [ELSIF ekspresi_boolean2 THEN urutan_perintah2;]
…
[ELSE
urutan_perintah3;
END IF];
Lebih jelas mengenai pemakaian If adalah sebagai berikut :
DECLARE a NUMBER; b NUMBER; BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1; IF b=1 THEN
INSERT INTO T1 VALUES(b,a); ELSE
INSERT INTO T1 VALUES(b+10,a+10); END IF;
END; /
LOOP
PL/SQL mendukung pengeksekusian pertah berulang menggunakan loop. Jenis loop yang terdapat dalam PL/SQL adalah :
1. Simple Loops
Sintaks simple loop adalah :
LOOP
16 Berikut ini contoh penggunaan LOOP :
DECLARE i NUMBER := 1; BEGIN
LOOP
INSERT INTO T1 VALUES(i,i); i := i+1;
EXIT WHEN i>100; END LOOP;
END; /
2. While Loops
Sintaks dari While Loop adalah :
WHILE kondisi LOOP urutan_perintah END LOOP;
Jika kondisi bernilai TRUE, urutan_perintah akan terus dieksekusi. Dalam loop ini perintah EXIT dapat digunakan jika dibutuhkan. Berikut ini contoh penggunaan while loop.
DECLARE i NUMBER := 1; vhitung number; BEGIN WHILE i <= 20 LOOP vhitung := i ** 2;
INSERT INTO T1 VALUES(i, vhitung); vhitung := 0;
i := i+1; END LOOP; END;
/
3. Numeric FOR Loops
17
vhit number; BEGIN
FOR vhitung IN 1..20 LOOP vhit := vhitung ** 3;
Insert into t1 values (vhitung, vhit); END LOOP;
END; /
Menangani ERROR
Penanganan error dalam PL/SQL lebih mudah dengan adanya bagian EXCEPTION dalam blok PL/SQL. Tidak seperti pemrograman dalam bahasa pemrograman lain seperti C yang harus menangkap error dengan mempergunakan perintah if. EXCEPTION dibagi dalam dua jenis yaitu :
1. Predefined Exception
Merupakan kondisi exception yang telah didefinisikan dalam oracle, diantaranya adalah : NO_DATA_FOUND, DUP_VAL_ON_INDEX, TOO_MANY_ROWS, INVALID_NUMBER, ZERO_DEVIDE dan PROGRAM_ERROR. Berikut ini contoh predefined exception.
set serveroutput on size 20000 DECLARE
vnim varchar2(5) := 12345; vnama mahasiswa.nama%type; vkomen char(25);
BEGIN
select nama into vnama from mahasiswa where nim=vnim; exception
when no_data_found then vkomen := 'Data tidak ada'; dbms_output.put_line(vkomen); END;
18 ditangkap dengan mempergunakan perintah if dan menyerahkannya ke variabel exception dengan perintah RAISE. Berikut ini contoh user-defined exception.
set serveroutput on size 20000 DECLARE vnama matakuliah.nm_mtk%type; vsks matakuliah.sks%type; e_jml_sks exception; vkomentar char(25); BEGIN
select nm_mtk, sks into vnama, vsks from matakuliah where kdmtk = 'mt01';
if vsks < 4 then RAISE e_jml_sks; end if;
EXCEPTION
when e_jml_sks then
vkomentar := 'Bobot SKS dibawah 4'; dbms_output.put_line(vkomentar); end;
/
19 PL/SQL ini memiliki nama. Seperti layaknya Procedure dan Function pada bahasa pemrograman yang sudah dipelajari (Visual basic, Delphi, Bahasa C dan lainnya).
Procedure
Procedure merupakan blok yang memiliki nama. Pemanggilan procedure dilakukan melalui blok PL/SQL lain. Penggunaan procedure merupakan fasilitas yang paling sering digunakan dalam membuat kontrol program di database Oracle. Procedure memiliki struktur yang mudah dipahami, terletak dalam database, dan mudah dipanggil untuk dieksekusi. Seperti dalam PL/SQL yang telah dipelajari pada nagian lalu, hanya saja untuk bagian DECLARE diganti dengan CREATE PROCEDURE. Cobalah prosedur berikut ini.
CREATE OR REPLACE PROCEDURE Tambah_Mahasiswa( vnim mahasiswa.nim%type,
vnama mahasiswa.nama%type, valamat mahasiswa.alamat%type) as BEGIN
INSERT INTO mahasiswa (nim, nama, alamat) VALUES(vnim, vnama,valamat);
END Tambah_Mahasiswa; /
Procedure diatas berfungsi untuk menambah data pada tabel mahasiswa. Nama prosedur adalah Tambah_Mahasiswa. Untuk penambahan data dapat dilakukan dengan mempergunakan pemanggilan procedure diikuti parameter. Sehingga tidak mempergunakan perintah Insert into …. Penambahan data dengan mempergunakan procedure tersebut dapat dilakukan dengan perintah berikut :
BEGIN
Tambah_Mahasiswa('11','Banu','Sleman'); END;
20 satu variabel yang dimasukkan diproses terlebih dahulu (variabel b).
CREATE OR REPLACE PROCEDURE AddT1 (a NUMBER, b OUT NUMBER) AS
BEGIN b := a * 4;
INSERT INTO T1 VALUES(a, b); END;
/
Jalankan script tersebut (procedure AddT1) dan cek dengan script berikut :
DECLARE v number; BEGIN addt1(10,v); END; /
Script diatas menambahkan data kedalam tabel T1 dengan nilai field pertama 10 dan nilai field kedua (v) dari hasil perhitungan dalam procedure.
FUNCTION
Function merupakan PL/SQL blok yang mirip dengan procedure. Perbedaannya adalah function mengembalikan suatu nilai dan dipanggil melalui suatu ekspresi. Untuk membuat function, diawali dengan CREATE OR REPLACE FUNCTION. Sama seperti membuat procedure, kalimat OR REPLACE digunakan untuk menimpa function yang sudah ada jika namanya sama. Berikut ini contoh function.
CREATE OR REPLACE FUNCTION HitSks(vnim krs.nim%type) RETURN matakuliah.sks%type is
vsks matakuliah.sks%type; Begin
select count(sks) into vsks from krs, matakuliah
21 dipergunakan dengan pemanggilan fungsi dengan perintah berikut ini pada prompt SQL *PLUS :
SQL> select nama, hitsks(nim) from mahasiswa where hitsks(nim)>2;
Pemanggilan fungsi dapat dilakukan di dalam suatu blok procedure. Semua nilai yang dikembalikan oleh function tersebut dapat dipergunakan untuk input suatu proses dalam suatu ekspresi didalam procedure. Justru kenyataanya, function banyak dipergunakan didalam blok procedure.
TRIGGER
Trigger merupakan PL/SQL blok yang mirip dengan procedure. Jika procedure dijalankan secara eksplisit lewat pemanggilan procedure, trigger dijalankan secara implisit lewat ‘pemicu’. Pemicu yang dimaksud adalah Data Manipulation Language (DML) yang terdiri atas perintah INSERT, UPDATE atau DELETE dari suatu tabel database. Trigger bermanfaat untuk :
• Mengatur integrity constraint yang kompleks yang tidak mungkin ditangani oleh sintaks-sintaks pembuatan tabel.
• Audit database dengan cara memasukkan informasi perubahan dan siapa yang mengubah saat ada user yang mengubah data.
• Secara otomatis memberi sinyal program lain untuk melakukan sesuatu jika isi tabel diubah.
Trigger dapat didefinisikan untuk operasi INSERT, UPDATE dan DELETE. Trigger ini dapat dipicu sebelum (BEFORE) atau sesudah (AFTER) operasi berjalan. Trigger juga berlaku untuk tingkat baris (FOR EACH ROW) yang berlaku untuk setiap baris tabel saat dimanipulasi, atau tingkat seluruh tabel yang dijalankan untuk seluruh tabel saat trigger itu dijalankan.
22
BEGIN insert into tlog
values (user, to_char(sysdate, 'Month DY, DD, HH24:MI'),'Tabel telah diubah'); END;
/
Trigger tersebut bernama TRIGUBAH, yang berguna untuk melakukan dokumentasi jika tabel mahasiswa diubah. Identitas perubah disimpan dalam field user, tanggal perubahan dan komentar. Ubah script trigger diatas menjadi script trigger berikut ini :
CREATE OR REPLACE TRIGGER TRIGUBAH
BEFORE DELETE OR INSERT OR UPDATE ON MAHASISWA BEGIN
If deleting then insert into tlog
values (user, to_char(sysdate, 'Month DY, DD, HH24:MI'),'Data pada tabel dihapus');
elsif inserting then insert into tlog
values (user, to_char(sysdate, 'Month DY, DD, HH24:MI'),'Data pada tabel ditambah');
elsif updating then insert into tlog
values (user, to_char(sysdate, 'Month DY, DD, HH24:MI'),'Data pada tabel diubah');
end if; END; /
Jalankan script trigger tersebut dan cobalah untuk menambah, mengupdate dan menghapus data pada tabel mahasiswa. Lihat isi tabel tlog. Tambahkan komentar anda pada laporan tugas mingguan.