topic04 exceptions

31
Tech Mahindra Limited confidential © Tech Mahindra Limited 2008 Exception Handling

Upload: anilkumarpv

Post on 12-May-2017

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Topic04 Exceptions

Tech Mahindra Limited confidential© Tech Mahindra Limited 2008

Exception Handling

Page 2: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 2

Objectives

At the end of this session, the participants will be able to:Understand the concept of Exceptions Comprehend the difference between system and user-defined exceptionsWrite PL/SQL blocks to handle system and user-defined exceptionsUnderstand the rules for Exception Propagation

Page 3: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 3

Agenda

What is an exception?Why exception handling is neededHandling Oracle predefined (named), non-predefined (unnamed) and user-defined exceptionsSQLERRM and SQL_CODEPragma EXCEPTION_INITPropagation of exceptions, raised in different parts of a PL/SQL block (nested blocks) with examples

Page 4: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 4

Exception Handling

Exception Handling in PL/SQL

An exception is an error situation which may arise during program execution

PLSQL supports Oracle named (predefined) and unnamed (not predefined) exceptions as well as user-defined exceptions

In any type of Exception, when the exception takes place the exception is said to be “RAISED”

An Exception Handler is used to specify the response for a raised exception

Page 5: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 5

Exception Handling

Exception Handling in PL/SQL (Contd.)

When an exception is raised, either implicitly or explicitly, the normal execution of the program is abandoned

The control then shifts to the corresponding exception handler if it is present else control shifts to the calling environment

In any case, when an exception is fired then the control can not return to the executable section of the current block

If an exception is handled then the program unit is considered as successful i. e. the effect of the operations performed before the exception is raised, is saved else the earlier operations are rolled back

Page 6: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 6

Types of ExceptionsNamed (predefined) Oracle ExceptionsUnnamed (Not predefined) Oracle Exceptions

User-defined Exceptions

Declare within thedeclarative section andraise explicitly

A condition that thedeveloper determines isabnormal

User-defined Exceptions

Declare within the declarative section. Associate an exception name with an Oracle error number and allow Oracle to raise them implicitly.

Set of Oracle standard exceptions that are not given name

Unnamed Exceptions

Do not declare and allow the Oracle server to raise them implicitly

Set of Oracle standard exceptions that are already named

Named Exceptions

Page 7: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 7

Exception Handling in PL/SQL

Named Exceptions Oracle has around 20 named predefined exceptionsTrapped within the Exception handling block

Some commonly encountered oracle named exceptions:

fired when trying to put an incompatible value in a variable or column

VALUE_ERROR

fired when trying to divide by zeroZERO_DIVIDE

fired when trying to FETCH from a cursor that is not open

INVALID_CURSOR

fired when SELECT INTO statement returns more than one row

TOO_MANY_ROWS

fired when SELECT INTO statement does not return any row

NO_DATA_FOUND

Page 8: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 8

Raising an Exception

1. An exception is raised implicitly if any Oracle predefined or non predefined error occurs e. g. when no rows are retrieved by SELECT statement, PL/SQL raises the exception NO_DATA_FOUND.

2. We raise an exception explicitly by issuing the RAISEstatement in the case of User defined Exceptions within the block

Page 9: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 9

Exception Handling in PL/SQL

If an exception is raised in the executable section and there is an associated handler, the exception is trapped (handled)

Handlers for various exceptions can be specified in theEXCEPTION section

A handler for an exception is of the form

WHEN exception_name THENa sequence of statements

EXCEPTIONWHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('WRONG INPUT');END;

ExampleExample

Page 10: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 10

Exception Handling: Example

DECLAREmyName VARCHAR2(8);

BEGINSELECT ename INTO myName FROM emp WHERE empno = &eno;DBMS_OUTPUT.PUT_LINE('Name of the employee : '|| myName);

EXCEPTIONWHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('WRONG EMPLOYEE NUMBER');WHEN VALUE_ERROR THEN

DBMS_OUTPUT.PUT_LINE(‘ Employee Name size larger than 8’);

END;/

Page 11: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 11

The OTHERS Handler

Most of the times Exceptions occur because of inappropriate values passed for user inputs

In a good program the probable exceptions are visualized and handled

However for a program, one may not be able to visualize all the probable exceptions

Handling all possible exceptions may make the program very bulky

OTHERS Handler

Page 12: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 12

The OTHERS Handler

To overcome this problem a “General Exception Handler” named “OTHERS” is provided by PL/SQL

The handler OTHERS traps exceptions not handled by the other handlers in the exception handling section of the block

Thus in a program separate handlers are written for those named or unnamed exceptions, that require some specific actions to be taken when the exception is fired while for all the remaining exceptions, the general OTHERS handler is used

OTHERS Handler

Page 13: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 13

Guidelines for Trapping Exceptions

WHEN OTHERS should be put up as the last handler

Handlers for several exceptions can be included in a single block but for a single exception only one handler can be written

At a time there can be only one active exception

Page 14: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 14

Various Predefined Named Exceptions: Example

DECLAREmyJob emp.job%TYPE;empRec emp%ROWTYPE;

BEGINmyJob :='&myJob';SELECT * INTO empRec FROM emp WHERE UPPER(job)= UPPER(myJob);

DBMS_OUTPUT.PUT_LINE(empRec.ename||' has salary '||empRec.sal);

EXCEPTION-- Various error handlers for predefined named exceptionsWHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('The job does not exist');WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.PUT_LINE('More than one employee with the job');

/* The handler OTHERS traps exceptions not handled in the other handlers in the exception handling section*/WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Other error ‘);END;/

Page 15: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 15

Functions for Trapping Error Code and Message

There are two built-in functions which can be used to find out which exception occurred during an execution of a program unit

SQLCODE Returns the error number of the corresponding Oracle error that was raised Returns 1 for user-defined exception

SQLERRMReturns the error message associated with the given error numberReturns “USER DEFINED EXCEPTION” for user-defined exceptions

Page 16: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 16

SQLCODE and SQLERRM: Example

CREATE TABLE errors (erCode NUMBER,erMessage VARCHAR2(512));

DECLAREv_code NUMBER;v_errm VARCHAR2(512);myNo NUMBER(1);

BEGINmyNo := '&myNo';

EXCEPTIONWHEN OTHERS THEN

v_code := SQLCODE;v_errm := SQLERRM(SQLCODE);DBMS_OUTPUT.PUT_LINE(SQLERRM);INSERT INTO errors VALUES(v_code, v_errm);

END;/

Note: SQLCODE and SQLERRM being procedural statements can not bedirectly used inside SQL statement; hence their values are assigned to variables first and then used in INSERT statement

Page 17: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 17

Review

How many exceptions are active at a time?

Recall some of the predefined exceptions.

Difference between SQLCODE and SQLERRM.

Page 18: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 18

Exception Handling in PL/SQL

Unnamed Oracle Exceptions

Unnamed exceptions can be trapped by using OTHERS handler

Unnamed exceptions can be handled by PRAGMAEXCEPTION_INIT which tells the compiler to associate an exception name with an oracle error number

PRAGMA keyword signifies that the statement is a compiler directive, which is not processed when the PL/SQL block is executed

Page 19: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 19

PRAGMA EXCEPTION_INIT: Example

DECLAREe_emp_exist EXCEPTION;--Naming non-predefined oracle errorPRAGMA EXCEPTION_INIT(e_emp_exist , -2292);v_deptno dept.deptno%TYPE := &dno;

BEGINDELETE FROM deptWHERE deptno = v_deptno;COMMIT;

EXCEPTIONWHEN e_emp_exist THENDBMS_OUTPUT.PUT_LINE(‘Can not delete deptEmployees exist’);

END;

Page 20: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 20

Exception Handling in PL/SQL

User-defined Exceptions

Declared in the Declare Section with data type as EXCEPTION

Raised Explicitly by using the RAISE keyword

Handled in the Exception Section

Local to a PL/SQL block

Declarative Section Executable Section Exception Handling Section

Declare Raise Reference

Page 21: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 21

User-defined Exception: Example

DECLARE-- Declaring user defined exceptione_check_sal EXCEPTION;v_empno emp.empno%TYPE :=&empno;emp_sal emp.sal%TYPE :=&empsal;mgr_sal emp.sal%TYPE;

BEGINSELECT e1.sal INTO mgr_sal FROM emp e,emp e1 WHERE e.mgr=e1.empno and e.empno=v_empno;IF(emp_sal > mgr_sal) THEN

RAISE e_check_sal; -- Raising user-defined exceptionELSE

UPDATE emp SET sal=emp_sal WHERE empno=v_empno;END IF;DBMS_OUTPUT.PUT_LINE('Salary updated');COMMIT;

EXCEPTION--Handling user defined exceptionWHEN e_check_sal THEN

DBMS_OUTPUT.PUT_LINE('Employee salary can not be greater than Manager salary');WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(‘ Wrong input’);END;

Page 22: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 22

Exception Propagation

Exceptions Raised in the Executable Section

PL/SQL uses the following rule to determine which exception handler to invoke:

1. Current block has a handler for the exception, execute it and complete the block successfully. Control then passes to the enclosing block.

2. No handler for current exception, propagate the exception by raising it in the enclosing block. Step 1 is executed for the enclosing block. If there is no enclosing block, the exception will be propagated out to the calling environment, such as SQL* Plus.

Page 23: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 23

Exceptions Raised in Executable Section

DECLAREA EXCEPTION;

BEGINBEGIN

RAISE A;EXCEPTION

WHEN A THEN. . .

END;………..END;

Exception A is raised in the inner blockA is handled in the inner block

Control resumes here

Example 1Example 1

Page 24: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 24

DECLAREA EXCEPTION;B EXCEPTION;

BEGINBEGIN

RAISE B;EXCEPTION

WHEN A THEN. . .

END;EXCEPTION

WHEN B THEN. . .

END;

Example 2Example 2

Exceptions Raised in Executable Section

Exception B is raised in the inner block

No handler for exception B in the inner block

Exception B is propagated to the enclosing block and handle thereControl then passes out of enclosing block, which completes successfully

Page 25: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 25

DECLAREv_number NUMBER(3):=‘ABC’;

BEGIN. . .

EXCEPTIONWHEN OTHERS THEN. . .

END;

Exceptions Raised in Declarative Section

Example 1Example 1

Illegal assignment raises VALUE_ERROR

Even though there is a WHEN OTHERS handler, it is not executed

The block completes unsuccessfully with the VALUE_ERROR exception

Page 26: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 26

BEGINDECLAREv_number NUMBER(3):=‘ABC’;

BEGIN. . .

EXCEPTIONWHEN OTHERS THEN. . .

END;EXCEPTION

WHEN OTHERS THEN. . .

END;

Exceptions Raised in Declarative Section

Example 2Example 2

Illegal assignment raises VALUE_ERROR

Even though there is an OTHERS handler for the inner block, it is not executed

The exception handler in the outer block handles the exception

Control then passes out of enclosing block which completes successfully

Page 27: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 27

Exceptions Raised in Exception Section

DECLAREA EXCEPTION;B EXCEPTION;

BEGINRAISE A;

EXCEPTIONWHEN A THEN

RAISE B;WHEN B THEN. . .

END;

Exception A is raised

Exception A is handled and B is raised in A’s handler

Even though there is a handler for B here, it is not executed. The exception is propagated out of the block

The block completes unsuccessfully with unhandled exception B

Page 28: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 28

Example – Exception Propagation

BEGINUPDATE dept SET loc = ‘New1' WHERE deptno =10;DECLARE

myJob emp.job%TYPE := '&myjob';empRec emp%ROWTYPE;

BEGINUPDATE dept SET loc = ‘New2' WHERE deptno =20;SELECT * INTO empRec FROM emp WHERE job= UPPER(myJob);

DBMS_OUTPUT.PUT_LINE(empRec.ename||' has salary '||empRec.sal);EXCEPTION

WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The job does not exist');

WHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE('More than one employee with the job');

WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('Other error '||SQLERRM);

END;UPDATE dept SET loc = ‘New3' WHERE deptno =30;

EXCEPTIONWHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('The inner block error is trapped here as raised in DECLARE section');

END;

Page 29: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 29

Brainteaser

What is the maximum number of handlers processed before the PL/SQL block is exited when an exception occurs?

Can DUP_VAL_ON_INDEX handle both primary key violation and unique key violation?

What is the significance of RAISE statement in exception handler?

Why WHEN OTHERS handler should be kept as the last handler?

Page 30: Topic04 Exceptions

CONFIDENTIAL© Copyright 2008 Tech Mahindra Limited 30

To

Summarize…

Summary

In this session, we have covered,

Terms: Exceptions and Exception handling

Predefined exceptions

User-defined exceptions

Rules for Exception Propagation

Page 31: Topic04 Exceptions

Tech Mahindra Limited confidential© Tech Mahindra Limited 2008

Thank You