• Tidak ada hasil yang ditemukan

Prosedur RAISE_APPLICATION_ERROR

Dalam dokumen DAFTAR ISI - System Manajemen Basis Data (Halaman 99-112)

6.3 Menambahkan Exception Handling

6.3.4 Prosedur RAISE_APPLICATION_ERROR

RAISE_APPLICATION_ERROR adalah prosedur yang dapat digunakan untuk membuat dan membangkitkan exception. Dapat digunakan pada bagian executable statemen mapun exception handler.

RAISE_APPLICATION_ERROR(nomor_error, pesan_error

o nomor_error harus berada dalam rentang -20999 dan -20000. Rentang ini sengaja disediakan untuk digunakan user.

o pesan_error adalah pesan kesalahan yang ingin dimunculkan.

o TRUE|FALSE adalah parameter optional, dengan nilai default FALSE. TRUE bertujuan untuk menangkap exception-exception sebelumnya bersama exception ini. FALSE bertujuan menggantikan exception terdahulu dengan exception ini.

Contoh - 1

/*Prosedur update gaji karyawan dengan exception handling pada bagian executable statemen*/

CREATE OR REPLACE PROCEDURE prc_upd_gaji (pi_nopeg VARCHAR2,

pi_gaji INTEGER) IS

BEGIN

-- Update gaji karyawan dengan NIP tertentu

UPDATE pegawai SET gaji = pi_gaji

WHERE no_peg = pi_nopeg;

-- Cek bila data tidak ditemukan

IF SQL%NOTFOUND THEN

RAISE_APPLICATION_ERROR(-20100, ‘Data tidak

ditemukan’);

END IF;

COMMIT; END;

Contoh - 2

/*Prosedur input data karyawan*/

CREATE OR REPLACE PROCEDURE prc_ins_peg (pi_nopeg VARCHAR2,

BEGIN

-- Insert data karyawan baru

INSERT INTO pegawai

VALUES (pi_nopeg, INITCAP(pi_nama), pi_tgl_masuk);

COMMIT;

EXCEPTION

WHEN DUP_VAL_ON_INDEX THEN

RAISE_APPLICATION_ERROR(-20101, ‘Duplikasi

NIP’);

END;

SQL> set serveroutput on;

SQL> exec prc_upd_gaji (‘PI-10001’,2000000); SQL> exec prc_ins_peg (‘PI-10001’, ‘Lia’);

Output :

Data tidak ditemukan Duplikasi NIP

Keterangan

Contoh-1 merupakan contoh penggunaan RAISE_APPLICATION_ERROR pada bagian executable statemen dan Contoh-2 adalah contoh penggunaan pada exception handler.

Rangkuman

7. Iterasi digunakan untuk mengeksekusi blok statemen secara berulang berdasar kondisi tertentu.

8. Jenis-jenis iterasi :

o Simple LOOP : minimal iterasi dijalankan satu kali. Harus ditambahkan statemen EXIT WHEN untuk menghindari eksekusi tak terbatas (infinitif).

LOOP

statemen-statemen;

END LOOP;

o Statemen FOR : tidak memiliki kondisi, perlu didefinisikan indeks minimal dan maksimal sebagai batas iterasi.

FOR var IN [REVERSE] indeks_min .. indeks_max LOOP

statemen-statemen;

END LOOP;

o Struktur ini selalu memeriksa kebenaran kondisi di awal blok iterasi. Bila kondisi bernilai FALSE, maka statemen-statemen dalam blok iterasi tidak akan dieksekusi.

WHILE kondisi LOOP statemen-statemen;

9. EXIT dan EXIT WHEN : digunakan untuk keluar dari blok iterasi tanpa melanjutkan proses yang sedang dilakukan.

EXIT WHEN kondisi;

IF kondisi THEN EXIT;

END IF;

10. Cursor adalah pointer yang menunjuk ke suatu bagian memori untuk menyimpan hasil instruksi SQL (biasanya merupakan multiple row) dan cursor digunakan untuk menunjuk (pointer) ke salah satu baris data. 11. Empat tahap dalam menggunakan cursor :

o deklarasi cursor (DECLARE)

o membuka cursor (OPEN)

o pengambilan data ke dalam cursor (FETCH)

o menutup cursor (CLOSE) 12. Jenis-jenis cursor :

o Eksplisit cursor : harus dibuka dan ditutup secara manual.

-- Deklarasi cursor DECLARE CURSOR nama_cursor IS statemen SELECT; -- Membuka cursor OPEN nama_cursor;

-- Menangkap isi cursor

FETCH nama_cursor INTO nama_variabel;

-- Menutup cursor

CLOSE nama_cursor;

o Implisit cursor : cursor yang tidak perlu dideklarasikan sebelumnya. Cursor ini berasosiasi dengan perintah SELECT, INSERT, DELETE,

13. Exception handling adalah cara mengatasi setiap kesalahan (error) atau peringatan (warning) yang muncul karena suatu perintah dengan menempatkan blok exception handler:

14. Jenis-jenis exception :

o Predefned exception : kesalahan internal yang dibangkitkan secara otomatis tiap kali suatu perintah menimbulkan kondisi yang sesuai dengan jenis kesalahan tersebut.

o User defined exception : harus dideklarasikan manual oleh user layaknya variabel.

nama_exception EXCEPTION;

Untuk membangkitkan exception ini :

RAISE nama_exception;

o Non-predefined exception : setelah dideklarasi, exception ini diasosiasikan ke sebuah error internal sehingga exception ini dibangkitkan secara otomatis.

nama_exception EXCEPTION;

PRAGMA EXCEPTION_INIT (nama_exception, nomor_error);

15. RAISE_APPLICATION_ERROR adalah prosedur yang disediakan untuk membuat dan membangkitkan exception. Dapat digunakan pada bagian executable statemen mapun exception handler.

RAISE_APPLICATION_ERROR(nomor_error, pesan_error

Kuis Benar Salah

1. Statemen WHILE akan selalu mengecek kondisi sebelum statemen dalam blok iterasi dilakukan.

2. Statemen EXIT dan EXIT WHEN hanya dapat digunakan pada Simple LOOP.

(Untuk soal 3 – 4, perhatikan blok PL/SQL berikut)

SET serveroutput ON; DECLARE v_awal INTEGER := 1; v_akhir INTEGER := 0; BEGIN LOOP DBMS_OUTPUT.PUT_LINE('Baris ke-'|| TO_CHAR(v_awal)); v_awal := v_awal + 1;

EXIT WHEN v_awal > v_akhir; END LOOP;

DBMS_OUTPUT.NEW_LINE; END;

3. Tidak ada output apapun yang akan ditampilkan ke layar. 4. Jika blok BEGIN – END diganti menjadi :

LOOP

EXIT WHEN v_awal > v_akhir;

DBMS_OUTPUT.PUT_LINE('Baris ke-'|| TO_CHAR(v_awal));

v_awal := v_awal + 1; END LOOP;

Tidak akan ada output apapun yang akan ditampilkan ke layar. (Untuk soal 5 - 6, perhatikan blok PL/SQL berikut)

SET serveroutput ON; DECLARE

n_akhir INTEGER := 5; BEGIN

FOR i IN 1 .. n_akhir LOOP DBMS_OUTPUT.PUT(i); EXIT WHEN i > 3; END LOOP;

DBMS_OUTPUT.NEW_LINE; END;

5. Output dari blok PL/SQL di atas adalah :

12345

6. Jika blok FOR LOOP diganti menjadi :

FOR i IN 1 .. n_akhir LOOP DBMS_OUTPUT.PUT(i); EXIT;

END LOOP;

Maka outputnya adalah :

12345

7. Perbedaan antara cursor implisit dan eksplisit adalah pada proses pembukaan dan penutupan cursor tersebut.

SET serveroutput ON; DECLARE

CURSOR cur_customer IS

SELECT cust_id, cust_name FROM customer WHERE UPPER(cust_name) LIKE UPPER('%eni%') ORDER BY cust_id;

v_Rec cur_customer%ROWTYPE; v_Row INTEGER := 0;

BEGIN

OPEN cur_customer;

WHILE cur_customer%FOUND LOOP FETCH cur_customer INTO vRec; END LOOP;

v_Row := cur_customer%rowcount;

DBMS_OUTPUT.PUT_LINE(‘Jumlah row = ’||v_Row); CLOSE cur_customer;

END;

8. Jika output query :

SELECT count(cust_id) FROM customer

WHERE UPPER(cust_name) LIKE UPPER('%eni%') ORDER BY cust_id;

adalah :

8

Maka output dari blok PL/SQL di atas adalah :

9. Jika blok BEGIN – END diganti menjadi :

OPEN cur_customer;

FETCH cur_customer INTO vRec;

WHILE cur_customer%FOUND LOOP FETCH cur_customer INTO vRec; END LOOP;

v_Row := cur_customer%rowcount;

DBMS_OUTPUT.PUT_LINE(‘Jumlah row = ’||v_Row); CLOSE cur_customer;

Maka output dari blok PL/SQL di atas menjadi :

Jumlah row = 7

10. Dengan prosedur RAISE_APPLICATION_ERROR, tidak perlu menggunakan statemen RAISE untuk membangkitkan sebuah exception.

Latihan

1. Sebutkan jenis-jenis statemen iterasi beserta perbedaan masing-masing. 2. Sebutkan jenis-jenis cursor beserta perbedaan masing-masing.

3. Sebutkan jenis-jenis exception beserta perbedaan masing-masing.

4. Buatlah sebuah prosedur untuk mencetak sejumlah bilangan prima pertama berdasar parameter input dengan menggunakan simple LOOP. Contoh :

Input = 5  Output : 2 3 5

Input = 15  Output : 2 3 5 7 11 13

5. Buatlah sebuah fungsi yang akan mengembalikan nilai faktorial dari sebuah parameter input.

Rumus faktorial : n! = n x (n-1) Contoh :

Input = 3  Output : 6 (didapat dari : 3! = 3x2x1 = 6)

Input = 5  Output : 120 (didapat dari : 5! = 5x4x3x2x1 = 120) (Untuk soal nomor 6 – 7, perhatikan table berikut)

emp_id mgr_id dept_id emp_name emp_salary

EM-10001 MG-10006 SAL Sarah 410

EM-10002 MG-10006 SAL John 360

EM-10003 MG-10007 HR Michael 430

EM-10004 MG-10007 HR George 320

EM-10005 MG-10006 SAL Henk 400

MG-10006 NULL SAL Natalie 810

6. Buatlah sebuah blok PL/SQL untuk menampilkan 5 employee dengan gaji tertinggi. Data yang ditampilkan meliputi : emp_id, emp_name, dan emp_salary. (Gunakan eksplisit cursor dan statemen WHILE).

7. Buatlah sebuah fungsi yang akan mengembalikan nama manager dari emp_id yang dimasukkan.

Contoh :

Input = EM-10001 Output : Natalie

(Gunakan implisit kursor dan salah satu exception handling apabila emp_id yang dimasukkan tidak ditemukan di table).

7

Tingkat Lanjut Konsep Prosedural

-Index, Prosedur, Fungsi-

Overview

Untuk meningkatkan performansi saat dilakukan query terhadap suatu tabel maka bisa dibuatkan index terhadap tabel tersebut dengan aturan tertentu. Untuk membuat kode PL/SQL lebih bersifat modular dan lebih mudah di- maintain, maka dapat digunakan prosedur dan fungsi yang melakukan tujuan spesifik.

Tujuan

Dalam dokumen DAFTAR ISI - System Manajemen Basis Data (Halaman 99-112)