Oracle Exceptions
Oracle Exceptions
What is an exception?
How to handle exceptions?
Predefined exceptions
When NO_DATA_FOUND exception is not raised?
User-defined exception
Reraising an exception
Associating an exception With An Oracle Error
Exception propagation
When is a PL/SQL block successful or failure?
What is an Exception?
In PL/SQL, errors and warnings are called as exceptions. Whenever a predefined error
occurs in the program, PL/SQL raises an exception. For example, if you try to divide a
number by zero then PL/SQL raises an exception called ZERO_DIVIDE and if SELECT
can not find a record then PL/SQL raises exception NO_DATA_FOUND.
PL/SQL has a collection of predefined exceptions. Each exception has a name. These
exceptions are automatically raised by PL/SQL whenever the corresponding error
occurs.
In addition to PL/SQL predefined exceptions, user can also create his own exceptions
to deal with errors in the applications. Understanding how to handle exception raised
by PL/SQL is as important as understanding how to write code to achieve task.
Because exception handling is an important part of any application and application is
not complete without exception handling.
How to handle exceptions?
When PL/SQL raises a predefined exception, the program is aborted by displaying
error message. But if program is to handle exception raised by PL/SQL then we have
to use Exception Handling part of the block.
Exception handling part is used to specify the statements to be executed when an
exception occurs. Control is transferred to exception handling part whenever an
exception occurs. After the exception handler is executed, control is transferred to
next statement in the enclosing block. If there is no enclosing block then control
returns to Host (from where you ran the PL/SQL block).
The following is the syntax of exception handling part.
exception
when no_data_found then
statements;
when too_many_rows then
statements;
end;
WHEN OTHERS is used to execute statements when an exception other than what
are mentioned in exception handler has occurred.
Note: If an exception is raised but not handled by exception handling part then
PL/SQL block is terminated by displaying an error message related to the exception.
Sample Programs
The following is an example of exception handler. This program assigns course fee of
“C” to course “C++”. If course “C” does not exist then it sets course fee of “C++” to
average fee of all courses.
declare
v_fee courses.fee%type;
begin
select fee into v_fee
from courses
where ccode = 'c';
update courses
set fee = v_fee
where ccode='c++';
exception
when no_data_found then
update courses
set fee = ( select avg(fee) from courses)
where ccode = 'c++';
end;
/
If SELECT cannot find a row course code “c” then it raises NO_DATA_FOUND
exception. When exception is raised, control is transferred to exception handling part
and course fee of “c++” is set to average course fee of all courses. If course code “c”
is found then it sets the course fee of course “c++” to the course fee of “c”.
declare
newccode varchar2(5) := null;
begin
update courses
set ccode = newccode
where ccode = 'c';
exception
when dup_val_on_index then
dbms_output.put_line('Duplicate course code');
when others then
dbms_output.put_line( sqlerrm);
end;
If you run the above program, the following output will be generated.
The above output is generated by WHEN OTHERS part of exception handling part.
SQLERRMS returns the error message of the most recent error. As we are trying to set
CCODE, which is a not null column to NULL value, PL/SQL raises an exception. But as
the error (-01407) is not associated with any predefined exception, WHEN OTHERS
part of exception handling part is executed.
Note: You cannot use SQLCODE or SQLERRM directly in a SQL statement. Instead, you
must assign their values to variables then use the variables in the SQL statement.
Predefined exceptions
PL/SQL has defined certain common errors and given names to these errors, which are
called as predefined exceptions. Each exception has a corresponding Oracle error
code.
The following is the list of predefined exceptions and the corresponding Oracle error
code.
Exception Oracle Error SQLCODE Value
We will understand how to detect whether UPDATE or DELETE command has affected
any row in the table, in the next chapter.
User-defined exception
PL/SQL allows you to create exceptions of your own. These exceptions are
available to the block in which they are created. Unlike a predefined exception,
which is predefined and automatically raised whenever the corresponding error
occurs, a user-defined error has the following steps.
Declaring userdefined exception
A userdefined exception is to be declared in the declare section of the block. The
following is the syntax to declare an exception.
exception-name exception;
exception-name is the name of the exception to be created.
declare
out_of_stock exception;
begin
statements;
end;
RAISE exception-name;
We have to decide when the user-defined exception has to be raised. For example, if you
want to raise OUT_OF_STOCK exception when value of variable QTY is less then 10,
give the following:
The following PL/SQL block will declare, raise and handle a user-defined exception.
declare
out_of_stock exception; -- declare exception
begin
if condition then
end if;
exception
end;
Reraising an exception
RAISE command can also be used to reraise an exception so that the current
exception is propagated to outer block. If a sub block executes RAISE statement
without giving exception name in exception handler then the current exception is
raised again.
declare
out_of_stock exception;
begin
...
begin ---------- sub-block (inner block) begins
...
if ... then
raise out_of_stock; -- raise the exception
end if;
.
.
exception
when out_of_stock then
-- handle the error in the sub block
raise; -- reraise the current exception, which is out_of_stock
...
end; ------------ sub-block ends
exception
when out_of_stock then
-- handle the exception (that is reraised) in outer block
...
end;
Note: RAISE statement without exception name is valid only in exception handler.
declare
null_value_error exception;
pragma exception_init(no_privilege, -1407);
Now, whenever Oracle error -1407 occurs, NULL_VALUE_ERROR exception is raised
by PL/SQL. The following example will illustrate important points related to associating
an Oracle error with a user-defined exception.
declare
null_value_error exception;
pragma exception_init(null_value_error, -1407);
newccode varchar2(5) := null;
begin
update courses
set ccode = newccode
where ccode = 'c';
exception
when null_value_error then
dbms_output.put_line(‘trying to set null value to a not null column’);
end;
/
Exception propagation
When an exception is raised by PL/SQL and if it not handled in the current block then
the exception is propagated. That means, the exception is sent to enclosing blocks one
after another from inside to outside until an error handler is found in one of the
enclosing blocks or there are no more blocks to search for handlers.
When an exception is not handled in any of the enclosing blocks then it is sent to host
environment.
The following figures illustrate how exceptions propagate.
In figure 1, exception A is raised by inner block. As there is an exception handler for
exception A, the exception is handled there itself. After the exception is handled,
control resumes with statements after inner block in outer block.
As the exception is handled in the block in which exception is raised, the exception is
not propagated and control resumes with the enclosing block.
BEGIN
STATEMENTS;
BEGIN
IF CONDITION THEN
RAISE A;
END IF;
EXCEPTION
WHEN A THEN
After exception A is
STATEMENTS;
handled in the inner block,
END;
control resumes with
enclosing block.
STATEMENTS;
EXCEPTION
WHEN B THEN
STATEMENTS;
END;
BEGIN
IF CONDITION THEN
RAISE A;
END IF;
EXCEPTION
WHEN B THEN
As exception A is not
STATEMENTS;
handled in the inner block,
END;
the exception is
propagated to outer block.
EXCEPTION
WHEN A THEN
STATEMENTS;
END;
BEGIN
STATEMENTS;
BEGIN
IF CONDITION THEN
RAISE A;
END IF;
EXCEPTION
WHEN B THEN
STATEMENTS;
END;
EXCEPTION
WHEN C THEN As exception A is not
STATEMENTS; handled in the inner block
END; and outer block, it is
propagated to host.
Host
begin
dbms_output.put_line('in outer block');
declare
ccode varchar2(5) := 'abcdef';
begin
-- some statements
dbms_output.put_line('in inner block');
exception
when others then
dbms_output.put_line(sqlerrm);
end;
dbms_output.put_line(' back in outer block');
exception
when others then
dbms_output.put_line('Error in outer block: ' || sqlerrm);
end;
/
When you run the above block, the following output will be generated:
in outer block
Error in outer block: ORA-06502: PL/SQL: numeric or value error:
character string buffer too small
Exits with an unhandled exception. That means the executable part raises an
exception (either predefined or user-defined) and it is not handled in the block’s
exception handler.
Executes RAISE_APPLICATION_ERROR procedure to generate an user-defined
error.
exception
when no_data_found then
if n = 0 then
...
elsif n = 1 then
...
else
...
end if
end;
/
In the above example, variable N is set to 0 at the time of declaration. If first SELECT
statement raised NO_DATA_FOUND exception then control is transferred to exception
handler and the value of N will be 0. If first SELECT succeeds and second SELECT has
failed then the value of N will be 1 and similarly the value of N will be 2 if second
SELECT also succeeds but third SELECT fails.
In the exception handler, it is possible to know which SELECT has failed by using the
value of variable N.
Summary
Errors and warnings in PL/SQL are called as exceptions. PL/SQL exceptions may be
either predefined or user-defined. Predefined exceptions are those that represent a
general failure. User can also define exception, in addition to predefined, and use
them identical to predefined exceptions. But user-defined exceptions are to be
explicitly declared and raised.
Exercises
1. Look for student number 1008. If it is not found then write a suitable error
message on the screen otherwise display the total amount paid by student so far.
2. _________ statement is used to re-raise an exception.
3. _________ function is used to get error message of the most recent error.
4. How do you associate an Oracle error with a user-defined error.
5. When UPDATE command could not update any rows then which of the following
will happen?
a. NO_DATA_FOUND exception occurs
b. INVALID_UPDATE exception occurs
c. No exception is raised
6. When an exception is not handled in the current block
a. It results in error and terminates the block
b. It is propagated to outer block
c. It is ignored.