Exception Handling in PLSQL POINTS TO DISCUSS What

  • Slides: 22
Download presentation
Exception Handling in PL/SQL

Exception Handling in PL/SQL

POINTS TO DISCUSS • What is Exception Handling • Structure of Exception Handling Section

POINTS TO DISCUSS • What is Exception Handling • Structure of Exception Handling Section • Types of Exceptions

What is Exception Handling • • Error condition in PL/SQL is called exception. A

What is Exception Handling • • Error condition in PL/SQL is called exception. A part of Executable section Between Begin… and end; Using Exception Handling we can test the code and avoid it from exiting abruptly. • When an exception occurs a message which explains its cause is received.

Exception consists of 3 parts • Type of Exception • An Error Code •

Exception consists of 3 parts • Type of Exception • An Error Code • A message By handling exceptions we ensure a PL/SQL block does not exit abruptly.

Syntax for exception DECLARE Exception Declaration BEGIN Executable statements… EXCEPTION WHEN ex_name 1 THEN

Syntax for exception DECLARE Exception Declaration BEGIN Executable statements… EXCEPTION WHEN ex_name 1 THEN -Error handling statements WHEN ex_name 2 THEN -Error handling statements WHEN Others THEN -Error handling statements END; When an exception is raised, Oracle searches for an appropriate exception handler in the exception section. Only one exception can be raised in a Block and the control does not return to the Execution Section after the error is handled.

Types of Exceptions • Pre defined Exceptions • Unnamed System Exceptions • User-defined Exceptions

Types of Exceptions • Pre defined Exceptions • Unnamed System Exceptions • User-defined Exceptions

Named System Exceptions (Predefined) • Automatically raised by Oracle when a program violates a

Named System Exceptions (Predefined) • Automatically raised by Oracle when a program violates a RDBMS rule • System exceptions that are raised frequently are predefined and given a name in Oracle • Not Declared explicitly • Raised implicitly when a predefined Oracle error occurs • Caught by referencing the standard name within an exception-handling routine

Some Named (Predefined) Exceptions Exception Name Reason Error Number CURSOR_ALREADY_OPEN When you open a

Some Named (Predefined) Exceptions Exception Name Reason Error Number CURSOR_ALREADY_OPEN When you open a cursor that is already ORA-06511 open. INVALID_CURSOR When you perform an invalid operation ORA-01001 on a cursor like closing a cursor, fetch data from a cursor that is not opened. NO_DATA_FOUND When a SELECT. . . INTO clause does not return any row from a table. TOO_MANY_ROWS When you SELECT or fetch more than ORA-01422 one row into a record or variable. ZERO_DIVIDE When you attempt to divide a number by. ORA-01476 zero. ORA-01403

Predefined Exception Example declare v_empno empno%type; v_ename emp. ename%type; v_sal emp. sal%type; a number;

Predefined Exception Example declare v_empno empno%type; v_ename emp. ename%type; v_sal emp. sal%type; a number; begin a: =&a; select empno, ename, sal into v_empno, v_ename, v_sal from emp where empno=&v_empno; v_sal: =v_sal+v_sal/a; dbms_output. put_line('Employee number is '||v_empno || ' and name is '||v_ename); dbms_output. put_line('New salary is '||v_sal); exception when no_data_found then dbms_output. put_line('NO SUCH RECORD!!!'); when zero_divide then dbms_output. put_line('Salary cannot be divided by zero'); when others then dbms_output. put_line('Some error. GOD knows what? ? ? '); end; /

Unnamed System Exceptions • System exception for which oracle does not provide a name

Unnamed System Exceptions • 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: 1. By using the WHEN OTHERS exception handler, or 2. By associating the exception code to a name and using it as a named exception.

Unnamed exceptions • We can assign a name to unnamed system exceptions using Pragma

Unnamed exceptions • We can assign a name to unnamed system exceptions using Pragma EXCEPTION_INIT. • EXCEPTION_INIT will associate a predefined Oracle error number to a programmer_defined exception name.

Syntax for unnamed system exception using EXCEPTION_INIT DECLARE exception_name EXCEPTION; PRAGMA EXCEPTION_INIT (exception_name, Err_code);

Syntax for unnamed system exception using EXCEPTION_INIT DECLARE exception_name EXCEPTION; PRAGMA EXCEPTION_INIT (exception_name, Err_code); BEGIN Execution section EXCEPTION WHEN exception_name THEN handle the exception END;

Example DECLARE dup_pr_key exception; pragma exception_init(dup_pr_key, -1); BEGIN insert into emp(empno, ename) values(1111, 'ABCD');

Example DECLARE dup_pr_key exception; pragma exception_init(dup_pr_key, -1); BEGIN insert into emp(empno, ename) values(1111, 'ABCD'); dbms_output. put_line('One record successfully inserted'); insert into emp(empno, ename) values(1111, 'EFGH'); dbms_output. put_line('One more record successfully inserted'); EXCEPTION when dup_pr_key then dbms_output. put_line('How come more employees with the same employee number !!!'); END; /

User-defined Exceptions • They should be explicitly declared in the declaration section. • They

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 userdefined exception name in the exception section.

User defined Exception-Example declare v_empno empno%type; v_ename emp. ename%type; v_sal emp. sal%type; a number;

User defined Exception-Example declare v_empno empno%type; v_ename emp. ename%type; v_sal emp. sal%type; a number; lo_sal exception; begin a: =&a; select empno, ename, sal into v_empno, v_ename, v_sal from emp where empno=&v_empno; v_sal: =v_sal+v_sal/a; if v_Sal<2000 then raise lo_sal; end if; dbms_output. put_line('Employee number is '||v_empno || ' and name is '||v_ename); dbms_output. put_line('New salary is '||v_sal); exception when lo_sal then dbms_output. put_line('In these times of Inflation INCREASE THE SALARY !!!'); when others then dbms_output. put_line('Some error. GOD knows what? ? ? '); end;

RAISE_APPLICATION_ERROR ( ) • a built-in procedure in oracle used to display the user-defined

RAISE_APPLICATION_ERROR ( ) • a built-in procedure in oracle used to display the user-defined error messages along with the error number • range of error number 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). • raises an exception but does not handle it.

WHY RAISE_APPLICATION_ERROR ? • to create a unique id for an user-defined exception. •

WHY RAISE_APPLICATION_ERROR ? • to create a unique id for an user-defined exception. • to make the user-defined exception look like an Oracle error.

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

Syntax 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 for RAISE_APPLICATION_ERROR procedure: • Declare a user-defined exception in the declaration section. •

Steps for RAISE_APPLICATION_ERROR procedure: • Declare a user-defined exception in the declaration section. • Raise the user-defined exception based on a specific business rule in the execution section. • Finally, catch the exception and link the exception to a user-defined error number in RAISE_APPLICATION_ERROR.

RAISE_APPLICATION_ERROR -Example DECLARE v_empno empno%type; v_ename emp. ename%type; v_sal emp. sal%type; a number; lo_sal

RAISE_APPLICATION_ERROR -Example DECLARE v_empno empno%type; v_ename emp. ename%type; v_sal emp. sal%type; a number; lo_sal exception; BEGIN a: =&a; select empno, ename, sal into v_empno, v_ename, v_sal from emp where empno=&v_empno; v_sal: =v_sal+v_sal/a; if v_Sal<2000 then raise lo_sal; end if; dbms_output. put_line('Employee number is '||v_empno || ' and name is '||v_ename); dbms_output. put_line('New salary is '||v_sal);

RAISE_APPLICATION_ERROR – Example(contd. ) EXCEPTION when lo_sal then RAISE_APPLICATION_ERROR(-20001, 'In these times of Inflation

RAISE_APPLICATION_ERROR – Example(contd. ) EXCEPTION when lo_sal then RAISE_APPLICATION_ERROR(-20001, 'In these times of Inflation INCREASE THE SALARY !!!'); when others then dbms_output. put_line('Some error. GOD knows what? ? ? '); END;

THANKS

THANKS