• No results found

When an exception occur a message which explains its cause is received. PL/SQL Exception message consists of three parts.

N/A
N/A
Protected

Academic year: 2021

Share "When an exception occur a message which explains its cause is received. PL/SQL Exception message consists of three parts."

Copied!
7
0
0

Loading.... (view fulltext now)

Full text

(1)

ERROR HANDLING IN PL/SQL

When an SQL statement fails, the Oracle engine recognizes this as an Exception Condition.

What is Exception Handling?

PL/SQL provides a feature to handle the Exceptions which occur in a PL/SQL Block known as exception Handling.

Using Exception Handling we can test the code and avoid it from exiting immediately.

When an exception occur a message which explains its cause is received. PL/SQL Exception message consists of three parts.

1) Type of Exception 2) An Error Code 3) A message

By handling the exceptions we can ensure a PL/SQL block does not exit immediately.

Structure of Exception Handling.

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;

Types of Exception.

There are 3 types of Exceptions. a) Named System Exceptions b) Unnamed System Exceptions c) User-defined Exceptions

(2)

ORACLE’S NAMED EXCEPTION HANDLERS

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 is known as Named System Exceptions.

The Oracle engine has around fifteen to twenty named exception handlers. These are not identified by names but by four integers preceded by a hyphen (-). E.g. -1489. The exception handler names are actually the set of negative signed integers.

Each exception handler has a code attached that will resolve an exception condition. This is how Oracle’s Default Exception-Handling works.

Named system exceptions are: • Not Declared explicitly,

• Raised implicitly when a predefined Oracle error occurs,

• Caught by referencing the standard name within an exception-handling routine. Following are some of the predefined Oracle named exception handlers.

Exception Description

ACCESS_INTO_NULL It is raised when a null object is automatically assigned a value. CASE_NOT_FOUND It is raised when none of the choices in the WHEN clauses of a

CASE statement is selected, and there is no ELSE clause. COLLECTION_IS_NULL It is raised when a program attempts to apply collection

methods other than EXISTS to an uninitialized nested table or varray, or the program attempts to assign values to the

elements of an uninitialized nested table or varray. DUP_VAL_ON_INDEX It is raised when duplicate values are attempted to be

stored in a column with unique index.

INVALID_CURSOR It is raised when attempts are made to make a cursor operation that is not allowed, such as closing an unopened cursor.

INVALID_NUMBER It is raised when the conversion of a character string into a number fails because the string does not represent a valid number.

LOGIN_DENIED It is raised when program attempts to log on to the database with an invalid username or password.

NO_DATA_FOUND It is raised when a SELECT INTO statement returns no rows. NOT_LOGGED_ON It is raised when a database call is issued without being

connected to the database.

PROGRAM_ERROR It is raised when PL/SQL has an internal problem.

(3)

incompatible data type.

SELF_IS_NULL It is raised when a member method is invoked, but the instance of the object type was not initialized.

STORAGE_ERROR It is raised when PL/SQL ran out of memory or memory was corrupted.

TOO_MANY_ROWS It is raised when s SELECT INTO statement returns more than one row.

VALUE_ERROR It is raised when an arithmetic, conversion, truncation, or size-constraint error occurs.

ZERO_DIVIDE It is raised when an attempt is made to divide a OTHERS Stands for all other exceptions not explicitly named.

Example

Let us write some simple code to illustrate the concept. We will be using the CUSTOMERS table we had created and used in the previous chapters:

DECLARE

c_id customers.id%type: = 8; c_name customers.name%type; c_addr customers.address%type; BEGIN

SELECT name, address INTO c_name, c_addr FROM customers

WHERE id = c_id;

DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name); DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line ('No such customer!'); WHEN OTHERS THEN

dbms_output.put_line ('Error!'); END;

/

When the above code is executed at SQL prompt, it produces the following result: No such customer!

PL/SQL procedure successfully completed.

The above program displays the name and address of a customer whose ID is given.

Since there is no customer with ID value 8 in our database, the program raises the run-time exception NO_DATA_FOUND, which is captured in EXCEPTION block.

(4)

Unnamed System Exceptions (USER-Named Exception Handlers)

Those system exception for which oracle does not provide a name is known as unnamed system exception.

These exceptions do not occur frequently. These exceptions have a code and an associated message.

There are two ways to handle unnamed system exceptions: • By using the WHEN OTHERS exception handler, or

• By associating the exception code to a name and using it as a named exception. We can assign a name to unnamed system exceptions using a Pragma called EXCEPTION_INIT.

EXCEPTION_INIT will associate a predefined Oracle error number to a programmer_defined exception name.

Steps to be followed to use unnamed system exceptions are • They are raised implicitly.

• If they are not handled in WHEN OTHERS must be handled explicitly. • To handle the exception explicitly, they must be declared using Pragma EXCEPTION_INIT as given above and handled referencing the user-defined exception name in the exception section.

The general syntax to declare unnamed system exception using EXCEPTION_INIT is DECLARE

exception_name EXCEPTION;

PRAGMA EXCEPTION_INIT (Exception_name, Error_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.

If we try to delete a product_id from the product table when it has child records in order_id table an exception will be thrown with oracle code number -2292.

(5)

We can provide a name to this exception and handle it in the exception section as given below.

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 system exceptions we can explicitly define exceptions based on business rules. These are known as user-defined exceptions.

Steps to be followed to use user-defined exceptions:

• They should be explicitly declared in the declaration section. • They should be explicitly raised in the Execution Section.

• They should be handled by referencing the user-defined exception name in the exception section.

EXAMPLE

The following example illustrates the concept. This program asks for a customer ID, when the user enters an invalid ID, the exception invalid_id is raised.

DECLARE

c_id customers.id%type := &cc_id; c_name customers.name%type; c_addr customers.address%type; -- user defined exception

ex_invalid_id EXCEPTION; BEGIN

IF c_id <= 0 THEN

RAISE ex_invalid_id; ELSE

SELECT name, address INTO c_name, c_addr FROM customers WHERE id = c_id;

DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name); DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); END IF;

(6)

EXCEPTION

WHEN ex_invalid_id THEN

dbms_output.put_line('ID must be greater than zero!'); WHEN no_data_found THEN

dbms_output.put_line('No such customer!'); WHEN others THEN

dbms_output.put_line('Error!'); END;

/

When the above code is executed at SQL prompt, it produces the following result: Enter value for cc_id: -6 (let's enter a value -6)

old 2: c_id customers.id%type := &cc_id; new 2: c_id customers.id%type := -6; ID must be greater than zero!

PL/SQL procedure successfully completed. 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 isin 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,

a) to create a unique id for an user-defined exception.

b) to make the user-defined exception look like an Oracle error. The General Syntax to use this procedure is:

RAISE_APPLICATION_ERROR (error_number, error_message); • The Error number must be between -20000 and -20999

(7)

Steps to be followed to use RAISE_APPLICATION_ERROR procedure: 1. Declare a user-defined exception in the declaration section.

2. Raise the user-defined exception based on a specific business rule in the execution section.

3. Finally, catch the exception and link the exception to a user-defined error number in RAISE_APPLICATION_ERROR.

Example

Using the above example we can display a error message using RAISE_APPLICATION_ERROR.

DECLARE

c_id customers.id%type := &cc_id; c_name customers.name%type; c_addr customers.address%type; -- user defined exception

ex_invalid_id EXCEPTION; BEGIN

IF c_id <= 0 THEN

RAISE ex_invalid_id; ELSE

SELECT name, address INTO c_name, c_addr FROM customers WHERE id = c_id;

DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name); DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); END IF;

EXCEPTION

WHEN ex_invalid_id THEN

raise_application_error(-20101, 'Invalid Customer Id'); END;

References

Related documents

Director of the Center for Research in Educational Policy College of Education, Health, and Human Sciences University of Memphis. 215

treatment analysis 94.. In today’s world most deaths are attributable to non communicable diseases &amp; over half of these are a result of cardiovascular diseases. Heart

2008, “The internationalization process of the Arabian firms: The case of the Saudi firms&#34; Proceedings of the Fifth Annual World Congress of the Academy for Global Business

(Something similar occurs in Problem- Solution patterns whenever a Response is negatively evaluated, since Negative Evaluation is one of the signals of Problem, as we saw

(The court held in the case (1) That where a check is accepted or certified by the bank on which it is drawn, the bank is estopped to deny the genuineness of the drawer's

 Presented at the Society for the Scientific Study of Religion Annual Meeting (Baltimore, MD), the American Sociological Association Annual Meeting (Atlanta, GA), and the

&#34;Innovative Techniques for Teaching Statistics.&#34; Presented at annual meetings of the Midwest Sociological

The notification provision and the requirement that food handlers and supervisors have food safety skills and knowledge commensurate with their duties within the food business, both