Exceptions
Oracle includes about 20 predefined exceptions (errors) – we can allow Oracle to raise these implicitly.
For errors that don’t fall into the predefined categories – declare in advance and allow oracle to raise an exception.
For problems that are not recognised as an error by Oracle – but still cause some difficulty within your application – declare a User Defined Error and raise it explicitly
i.e IF x >20 then RAISE …
Syntax:
EXCEPTION WHEN exception1 [OR exception2...]] THEN ... [WHEN exception3 [OR exception4...] THEN ...] [WHEN OTHERS THEN ...]
Where exception is the exception_name e.g. WHEN NO_DATA_FOUND… Only one handler is processed before leaving the block.
Trap non-predefined errors by declaring them You can also associate the error no. with a name so that you can write a specific handler.
This is done with the PRAGMA EXCEPION_INIT pragma.
PRAGMA (pseudoinstructions) indicates that an item is a ‘compiler directive’ Running this has no immediate effect but causes all subsequent references to the exception name to be interpreted as the associated Oracle Error.
–
Trapping a non-predefined Oracle server exception
DECLARE -- name for exception e_emps_remaining EXCEPTION PRAGMA_EXCEPTION_INIT ( e_emps_remaining, -2292); v_deptno dept.deptno%TYPE :=&p_deptno; BEGIN DELETE FROM dept WHERE deptno = v_deptno COMMIT; EXCEPTION WHEN e_emps_remaining THEN DBMS_OUTPUT.PUT_LINE ('Cannot remove dept '|| TO_CHAR(v_deptno) || '. Employees exist. '); END;
When an exception occurs you can identify the associated error code/message with two supplied functions SQLCODE and SQLERRM
SQLCODE – Number
SQLERRM – message
An example of using these:
DECLARE v_error_code NUMBER; v_error_message VARCHAR2(255); BEGIN ... EXCEPTION WHEN OTHERS THEN ROLLBACK; v_error_code := SQLCODE v_error_message := SQLERRM INSERT INTO t_errors VALUES ( v_error_code, v_error_message); END;
Trapping user-defined exceptions
DECLARE the exception
RAISE the exception
Handle the raised exception
e.g.
DECLARE e_invalid_product EXCEPTION BEGIN update PRODUCT SET descrip = '&prod_descr' WHERE prodid = &prodnoumber'; IF SQL%NOTFOUND THEN RAISE e_invalid_product; END IF; COMMIT; EXCEPTION WHEN e_invalid_product THEN DBMS_OUTPUT.PUT_LINE ('INVALID PROD NO'); END;
Propagation of Exception handling in sub blocks
If a sub block does not have a handler for a particular error it will propagate to the enclosing block – where it can be caught by more general exception handlers.
RAISE_APPLICATION_ERROR (error_no, message[,{TRUE|FALSE}]);
This procedure allows user defined error
messages from stored sub programs – call only from stored sub prog.
error_no = a user defined no (between -20000 and -20999)
TRUE = stack errors
FALSE = keep just last
This can either be used in the executable section of code or
the exception section
e.g.
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-2021,
‘manager not a valid employee’);
END;
Standard Exceptions, from the the STANDARD package
Oracle Exception Name |
Oracle Error |
Explanation |
DUP_VAL_ON_INDEX | ORA-00001 | You attempted to create a duplicate value in a field restricted by a unique index. |
TIMEOUT_ON_RESOURCE | ORA-00051 | A resource timed out, took too long. |
TRANSACTION_BACKED_OUT | ORA-00061 | The remote portion of a transaction has rolled back. |
INVALID_CURSOR | ORA-01001 | The cursor does not yet exist. The cursor must be OPENed before any FETCH cursor or CLOSE cursor operation. |
NOT_LOGGED_ON | ORA-01012 | You are not logged on. |
LOGIN_DENIED | ORA-01017 | Invalid username/password. |
NO_DATA_FOUND | ORA-01403 | No data was returned |
TOO_MANY_ROWS | ORA-01422 | You tried to execute a SELECT INTO statement and more than one row was returned. |
ZERO_DIVIDE | ORA-01476 | Divide by zero error. |
INVALID_NUMBER | ORA-01722 | Converting a string to a number was unsuccessful. |
STORAGE_ERROR | ORA-06500 | Out of memory. |
PROGRAM_ERROR | ORA-06501 | Generic "Contact Oracle support" message. |
VALUE_ERROR | ORA-06502 | You tried to perform an operation and there was a error on a conversion, truncation, or invalid constraining of numeric or character data. |
ROWTYPE_MISMATCH | ORA-06504 | |
CURSOR_ALREADY_OPEN | ORA-06511 | The cursor is already open. |
ACCESS_INTO_NULL | ORA-06530 | |
COLLECTION_IS_NULL | ORA-06531 |
Named exceptions
An exception can be given a name. In order to create such a named exceptions, two steps are necessary: first, it needs a line that readsexception_name exception
. Then, this exception must be connected to a number with the pragma exception_init(exception_name, exc-number)
. The number must be in the range -20999 through -20000 (these are negative numbers!).
create or replace package exc as some_exc exception; pragma exception_init(some_exc, -20005); procedure raise_exc; end exc; / create or replace package body exc as procedure raise_exc is begin raise some_exc; end raise_exc; end exc; / create or replace package use_exc as procedure do; end use_exc; / create or replace package body use_exc as procedure do is begin exc.raise_exc; exception when exc.some_exc then dbms_output.put_line('some_exc'); when others then dbms_output.put_line('others' ); end do; end use_exc; / set serveroutput on begin use_exc.do; end; /
The output:
some_exc
Reference -http://www.adp-gmbh.ch/ora/plsql/exception.html