EXCEPTION HANDLING IN PL/SQL
EXCEPTION: Runtime errors are called an Exception. If at any
time an error occurs in the PL/SQL block at that time PL/SQL
block execution is stopped and oracle returns an error message.
To continue the program execution and to display user
friendly message exception needs to be handle exception include
exception block in PL/SQL.
Exceptions are classified into two types. Those are
1) System/Pre Defined Exception
2) User Defined Exception
Syntax:
Declare
< Variables, cursor, user define exception>;
Begin
<statements…………..>;
Exception
When <Exception Name> then
<Error Statements…….>;
End;
1)System/Pre-Defined Exception:
These are defined by ORACLE by default. Whenever runtime error is
occurred in PL/SQL then we use an appropriate pre defined
exception in the program.
SOME PRE-DEFINED EXCEPTIONS:
i. No_data_found
ii. Too_many_rows
iii. Zero_divide
iv. Invalid _cursor
v. Cursor_already_open……etc
No_data_found: Whenever PL/SQL block carry the SELECT…..INTO
clause and also if required data not available in a table then ORACLE
server returns an exception.
Ex: ORA-1403: no data found
To handle this exception oracle provided “No_data_found” exception.
Ex:
DECLARE TENAME VARCHAR2(20);TSAL NUMBER(10);
BEGIN
SELECT ENAME,SAL INTO TENAME,TSAL FROM EMPLOYEE WHERE
EID=&EID;
DBMS_OUTPUT.PUT_LINE(TENAME||','||TSAL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('RECORD IS NOT FOUND');
END;
/
Too_many_rows: When SELECT…..INTO clause try to return more
than one value or one row then oracle server returns an error.
EX: ORA-1422: Exact fetch returns more than requested number of rows.
To handle for this error oracle provide “Too_many_rows” exception.
EX:
DECLARE TSAL NUMBER(10);
BEGIN
SELECT SAL INTO TSAL FROM EMPLOYEE;
DBMS_OUTPUT.PUT_LINE(TSAL);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('FETCHING MORE THAN ONE');
END;
Zero_divide:- In oracle when we are tried to perform division with zero
then oracle return an error.
ORA-1476: divisor is equal to zero.
To handle for this error oracle provide “Zero_divide” exception
EX:
DECLARE X NUMBER(10);Y NUMBER(10);Z NUMBER(10);
BEGIN
X:=&X;
Y:=&Y;
Z:=X/Y;
DBMS_OUTPUT.PUT_LINE('RESULT:-'||Z);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('SECOND NUMBER SHOULD NOT BE
ZERO');
END;
/
Invalid cursor: When we are not opening the cursor but we are try to
perform operations on cursor then ORACLE returns an error.
EX: ORA-1001: invalid cursor
To handle this error oracle provide “Invalid_cursor” exception.
EX:
declare
cursor c1 is select * from employee;
teid number(10);tename varchar2(20);tsal number(10);tage number(10);
begin
fetch c1 into teid,tename,tsal,tage;
dbms_output.put_line(teid||' '||tename||' '||tsal||' '||tage);
close c1;
exception
when invalid_cursor then
dbms_output.put_line('First you must open the cursor');
end;
/
Cursor_already_open: Before reopening the cursor we must close the
cursor properly otherwise ORACLE returns an error i.e.
EX: ORA-6511: Cursor_already_open
To handle this error oracle provide ‘Cursor_already_open’ exception.
EX:
declare
cursor c1 is select * from employee;
teid number(10);tename varchar2(20);tsal number(10);tage number(10);
begin
open c1;
loop
fetch c1 into teid,tename,tsal,tage;
exit when c1%notfound;
dbms_output.put_line(teid||' '||tename||' '||tsal||' '||tage);
end loop;
open c1;
exception
when cursor_already_open then
dbms_output.put_line('we must close the cursor before reopen');
end;
SQLCODE & SQLERRM: PL/SQL provides following built-in
properties which are used in error handling.
SQLCODE returns error code.
SQLERRM returns error message.
Ex:
DECLARE
X NUMBER(10);
Y NUMBER(20);
Z NUMBER(10);
BEGIN
X:=&X;
Y:=&Y;
Z:=X/Y;
DBMS_OUTPUT.PUT_LINE(Z);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE);
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
OUTPUT:
Enter value for x: 10
Enter value for y: 2
5
Enter value for x: 10
Enter value for y: 0
-1476---------error code
ORA-01476: divisor is equal to zero------error message