Selasa, 26 November 2013

Handling Exceptions

Sebuah Informasi yang cukup bermanfaat bagi yang ingin mempelajari PL/SQL, karena ini termasuk dasar dari PL/SQL.

Handling Exceptions
 merupakan salah satu kelebihan dari PL/SQL yang digunakan untuk menangani error yang terjadi pada saat run time.
Sebagai contoh, pada saat kita menuliskan sebuah query, dan data tersebut tidak ditemukan di dalam database, maka oracleakan membangkitkan eksepsi NO_DATA_FOUND  dengan kode ORA-01403 yang berarti data tidak ditemukan. Berikut ini kita akan menuliskan perbedaan dengan menggunakan blok eksepsi dengan yang tidak menggunakan blok eksepsi.
Contoh Yang tidak Menggunakan blok eksepsi :
SET SERVEROUTPUT ON
DECLARE
nama employees.last_name
%type;
BEGIN
SELECT last_name INTO nama FROM employees
WHERE employee_id = 309;
DBMS_OUTPUT.PUT_LINE ('nama');
END;
Hasilnya:
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4
Contoh Yang Menggunakan Blok Eksepsi :
SET SERVEROUTPUT ON
DECLARE
nama employees.last_name
%type;
BEGIN
SELECT last_name INTO nama FROM employees
WHERE employee_id = 309;
DBMS_OUTPUT.PUT_LINE ('nama');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('TIdak Ditemukan Datanya dalam Database');
END;
Hasilnya :
TIdak Ditemukan Datanya dalam Database
PL/SQL procedure successfully completed.

Berikut ini merupakan nama beserta Code exception di PL/SQL




Berikut ini merupakan keterangan dari nama exception di PL/SQL



Pada variabel dengan tipe data skalar, kita tidak dapat menampung banyak nilai dalam variabel tersebut, untuk menangani error yang terjadi ketika kita memasukkan banyak nilai ke dalam satu variabel skalar, maka kita menggunakan EXCEPTION TOO_MANY_ROWS
Contoh :
DECLARE
empno 
NUMBER;
BEGIN
SELECT employee_id INTO empno FROM employees ;
DBMS_OUTPUT.PUT_LINE(empno);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('THERE ARE TOO MANY ROWS');
END;
Hasilnya :
THERE ARE TOO MANY ROWS
PL/SQL procedure successfully completed.
Kita tidak perlu menghafal semua nama dari setiap exception handling diatas, kita cukup hanya menghafal beberapa saja dan sisanya kita dapat menggunakan eksepsi OTHERS.
DECLARE
empno 
NUMBER;
BEGIN
SELECT employee_id INTO empno FROM employees ;
DBMS_OUTPUT.PUT_LINE(empno);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Data Tidak Ditemukan');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Terjadi Error yang Lain');
END;
Hasil :
Terjadi Error yang Lain
PL/SQL procedure successfully completed.

PRAGMA EXCEPTION INIT

PRAGMA EXCEPTION INIT digunakan agar  kita dapat mendefinisikan nama EXCEPTION kita sendiri, tetapi berdasakan dengan ERROR CODE yang ada.
contoh :
SET SERVEROUTPUT ON
DECLARE
kebanyakan EXCEPTION;
PRAGMA EXCEPTION_INIT(kebanyakan, -01422);
emp employees.employee_id
%type;
BEGIN
SELECT employee_id INTO emp FROM Employees;
DBMS_OUTPUT.PUT_LINE(EMP);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Hasil tidak ditemukan');
WHEN kebanyakan THEN
DBMS_OUTPUT.PUT_LINE(‘hasilnya kebanyakan’);
END;
Penjelasan :
Pada mulanya error code -01422 merupakan code exception dari TOO_MANY_ROWS, tetapi dengan menggunakan PRAGMA_EXCEPTION_INIT, kita merubah TOO_MANY_ROW menjadi KEBANYAKAN. Yang sebelumnya, KEBANYAKAN telah dideklarasikan terlebih dahulu dengan menjadi sebuah EXCEPTION.

SQLCODE dan SQLERRM

SQLCODE dan SQLERRM biasa digunakan pada EXCEPTION OTHERS untuk mengetahui error apa yang terjadi. SQLCODE untuk menampilkan kode eksepsi, sedangkan SQLERRM digunakan untuk menampilkan keterangan eksepsi.
contoh :
SET SERVEROUTPUT ON
DECLARE
emp employees%rowtype;
BEGIN
SELECT * into emp FROM EMPLOYEES WHERE employee_id > 100;
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.PUT_LINE('No Data Found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR');
DBMS_OUTPUT.PUT_LINE('error code ='||SQLCODE);
DBMS_OUTPUT.PUT_LINE('error message ='||SQLERRM);
END;
Hasilnya :
ERROR 
error code =-1422 
error message =ORA-01422: exact fetch returns more than requested number of rows 
PL/SQL procedure successfully completed.

RAISE APPLICATION ERROR

Pada PRAGMA EXCEPTION INIT kita hanya dapat mendefinisikan sendiri nama dari eksepsi tersebut dan masih harus sesuai dengan ERROR CODEnya. Tetapi dengan menggunakan RAISE APPLICATION ERROR, kita dapat menentukan sendiri nama beserta code dari eksepsi yang kita inginkan.
contoh :
SET SERVEROUTPUT ON
DECLARE
name 
VARCHAR2(100);
sal 
NUMBER;
BEGIN 
SELECT last_name, salary INTO name, sal FROM employeesWHERE employee_id = 120;
IF sal > 5000 THEN
RAISE_APPLICATION_ERROR (-20000,'Gaji Kebanyakan');
END IF;
DBMS_OUTPUT.PUT_LINE(name||' '||sal);
END;
Hasilnya :
DECLARE *
ERROR at line 1: 
ORA-20000: Gaji Kebanyakan 
ORA-06512: at line 8