|
Exception Handling in PL/SQL
|
|
11-15-2009, 05:01 AM
Post: #1
|
||||||||||||||||||
|
||||||||||||||||||
Exception Handling in PL/SQL
Exception HandlingIn this section we will discuss about the following, 1) What is Exception Handling?PL/SQL provides a feature to handle the Exceptions which occur in a PL/SQL Block known as exception Handling. 2) Structure of Exception Handling.
The General Syntax for coding the exception section DECLARE Declaration section BEGIN Exception section EXCEPTION WHEN ex_name1 THEN -Error handling statements WHEN ex_name2 THEN -Error handling statements WHEN Others THEN -Error handling statements END; General PL/SQL statments can be used in the Exception Block. When an exception is raised, Oracle searches for an appropriate exception handler in the exception section. For example in the above example, if the error raised is 'ex_name1 ', then the error is handled according to the statements under it. Since, it is not possible to determine all the possible runtime errors during testing fo the code, the 'WHEN Others' exception is used to manage the exceptions that are not explicitly handled. Only one exception can be raised in a Block and the control does not return to the Execution Section after the error is handled.
If there are nested PL/SQL blocks like this. DELCARE Declaration section BEGIN
EXCEPTION Exception section END; In the above case, if the exception is raised in the inner block it should be handled in the exception block of the inner PL/SQL block else the control moves to the Exception block of the next upper PL/SQL Block. If none of the blocks handle the exception the program ends abruptly with an error. 3) Types of Exception.
There are 3 types of Exceptions. a) Named System Exceptions
System exceptions are automatically raised by Oracle, when a program violates a RDBMS rule. There are some system exceptions which are raised frequently, so they are pre-defined and given a name in Oracle which are known as Named System Exceptions. For example: NO_DATA_FOUND and ZERO_DIVIDE are called Named System exceptions. Named system exceptions are:
For Example: Suppose a NO_DATA_FOUND exception is raised in a proc, we can write a code to handle the exception as given below. BEGIN Execution section EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line ('A SELECT...INTO did not return any row.');
END; b) Unnamed System ExceptionsThose system exception for which oracle does not provide a name is known as unamed system exception. There are two ways to handle unnamed sysyem exceptions: We can assign a name to unnamed system exceptions using a Pragma called EXCEPTION_INIT.
Steps to be followed to use unnamed system exceptions are The general syntax to declare unnamed system exception using EXCEPTION_INIT is: DECLARE exception_name EXCEPTION; PRAGMA EXCEPTION_INIT (exception_name, Err_code); BEGIN Execution section EXCEPTION WHEN exception_name THEN handle the exception END;
For Example: Lets consider the product table and order_items table from sql joins. Here product_id is a primary key in product table and a foreign key in order_items table. DECLARE Child_rec_exception EXCEPTION; PRAGMA EXCEPTION_INIT (Child_rec_exception, -2292); BEGIN Delete FROM product where product_id= 104; EXCEPTION WHEN Child_rec_exception THEN Dbms_output.put_line('Child records are present for this product_id.');
END; / c) User-defined Exceptions
Apart from sytem exceptions we can explicity define exceptions based on business rules. These are known as user-defined exceptions. Steps to be followed to use user-defined exceptions: For Example: Lets consider the product table and order_items table from sql joins to explain user-defined exception. DECLARE huge_quantity EXCEPTION; CURSOR product_quantity is SELECT p.product_name as name, sum(o.total_units) as units FROM order_tems o, product p WHERE o.product_id = p.product_id; quantity order_tems.total_units%type; up_limit CONSTANT order_tems.total_units%type := 20; message VARCHAR2(50); BEGIN FOR product_rec in product_quantity LOOP quantity := product_rec.units; IF quantity > up_limit THEN message := 'The number of units of product ' || product_rec.name || ' is more than 20. Special discounts should be provided. Rest of the records are skipped. ' RAISE huge_quantity; ELSIF quantity < up_limit THEN v_message:= 'The number of unit is below the discount limit.'; END IF; dbms_output.put_line (message); END LOOP; EXCEPTION WHEN huge_quantity THEN dbms_output.put_line (message); END; / RAISE_APPLICATION_ERROR ( )
RAISE_APPLICATION_ERROR is a built-in procedure in oracle which is used to display the user-defined error messages along with the error number whose range is in between -20000 and -20999. Whenever a message is displayed using RAISE_APPLICATION_ERROR, all previous transactions which are not committed within the PL/SQL Block are rolled back automatically (i.e. change due to INSERT, UPDATE, or DELETE statements). RAISE_APPLICATION_ERROR raises an exception but does not handle it. RAISE_APPLICATION_ERROR is used for the following reasons, The General Syntax to use this procedure is: RAISE_APPLICATION_ERROR (error_number, error_message); • The Error number must be between -20000 and -20999 • The Error_message is the message you want to display when the error occurs. Steps to be folowed to use RAISE_APPLICATION_ERROR procedure: Using the above example we can display a error message using RAISE_APPLICATION_ERROR. DECLARE huge_quantity EXCEPTION; CURSOR product_quantity is SELECT p.product_name as name, sum(o.total_units) as units FROM order_tems o, product p WHERE o.product_id = p.product_id; quantity order_tems.total_units%type; up_limit CONSTANT order_tems.total_units%type := 20; message VARCHAR2(50); BEGIN FOR product_rec in product_quantity LOOP quantity := product_rec.units; IF quantity > up_limit THEN RAISE huge_quantity; ELSIF quantity < up_limit THEN v_message:= 'The number of unit is below the discount limit.'; END IF; Dbms_output.put_line (message); END LOOP; EXCEPTION WHEN huge_quantity THEN raise_application_error(-2100, 'The number of unit is above the discount limit.'); END; / |
||||||||||||||||||
|
« Next Oldest | Next Newest »
|
Search
Member List
Calendar
Help



