handling exceptions
DESCRIPTION
Handling Exceptions. Handling Exceptions with PL/SQL. What is an exception? Identifier in PL/SQL that is raised during execution How is it raised? An Oracle error occurs. You raise it explicitly. How do you handle it? Trap it with a handler. Propagate it to the calling environment. - PowerPoint PPT PresentationTRANSCRIPT
Handling ExceptionsHandling ExceptionsHandling ExceptionsHandling Exceptions
Handling Exceptions with Handling Exceptions with PL/SQLPL/SQL
Handling Exceptions with Handling Exceptions with PL/SQLPL/SQL What is an exception?What is an exception?
• Identifier in PL/SQL that is raised during Identifier in PL/SQL that is raised during executionexecution
How is it raised?How is it raised?• An Oracle error occurs.An Oracle error occurs.• You raise it explicitly.You raise it explicitly.
How do you handle it?How do you handle it?• Trap it with a handler.Trap it with a handler.• Propagate it to the calling environment.Propagate it to the calling environment.
What is an exception?What is an exception?• Identifier in PL/SQL that is raised during Identifier in PL/SQL that is raised during
executionexecution How is it raised?How is it raised?
• An Oracle error occurs.An Oracle error occurs.• You raise it explicitly.You raise it explicitly.
How do you handle it?How do you handle it?• Trap it with a handler.Trap it with a handler.• Propagate it to the calling environment.Propagate it to the calling environment.
Handling ExceptionsHandling ExceptionsHandling ExceptionsHandling Exceptions
Trap the Trap the exceptionexceptionDECLAREDECLARE
BEGINBEGIN
END;END;
Exception Exception is raisedis raised
EXCEPTIONEXCEPTION
Exception Exception is trappedis trapped
Propagate the exceptionPropagate the exception
DECLAREDECLARE
BEGINBEGIN
END;END;
Exception Exception is raisedis raised
EXCEPTIONEXCEPTION
Exception isException isnot trappednot trapped
Exception Exception propagates to calling propagates to calling
environmentenvironment
Exception TypesException TypesException TypesException Types
Predefined Oracle ServerPredefined Oracle Server Non-predefined Oracle ServerNon-predefined Oracle Server User-definedUser-defined
Predefined Oracle ServerPredefined Oracle Server Non-predefined Oracle ServerNon-predefined Oracle Server User-definedUser-defined
}} Implicitly Implicitly raisedraised
Explicitly raisedExplicitly raised
Trapping ExceptionsTrapping ExceptionsTrapping ExceptionsTrapping Exceptions
EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN statement1; statement2; . . .] [WHEN OTHERS THEN statement1; statement2; . . .]
EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN statement1; statement2; . . .] [WHEN OTHERS THEN statement1; statement2; . . .]
SyntaxSyntax SyntaxSyntax
Trapping Exceptions GuidelinesTrapping Exceptions GuidelinesTrapping Exceptions GuidelinesTrapping Exceptions Guidelines
WHEN OTHERS is the last clause.WHEN OTHERS is the last clause. EXCEPTION keyword starts exception-EXCEPTION keyword starts exception-
handling section.handling section. Several exception handlers are allowed.Several exception handlers are allowed. Only one handler is processed before Only one handler is processed before
leaving the block.leaving the block.
WHEN OTHERS is the last clause.WHEN OTHERS is the last clause. EXCEPTION keyword starts exception-EXCEPTION keyword starts exception-
handling section.handling section. Several exception handlers are allowed.Several exception handlers are allowed. Only one handler is processed before Only one handler is processed before
leaving the block.leaving the block.
Trapping Predefined Trapping Predefined Oracle Server ErrorsOracle Server ErrorsTrapping Predefined Trapping Predefined Oracle Server ErrorsOracle Server Errors
Reference the standard name in the Reference the standard name in the exception-handling routine.exception-handling routine.
Sample predefined exceptions: Sample predefined exceptions: • NO_DATA_FOUNDNO_DATA_FOUND• TOO_MANY_ROWSTOO_MANY_ROWS• INVALID_CURSORINVALID_CURSOR• ZERO_DIVIDEZERO_DIVIDE• DUP_VAL_ON_INDEXDUP_VAL_ON_INDEX
Reference the standard name in the Reference the standard name in the exception-handling routine.exception-handling routine.
Sample predefined exceptions: Sample predefined exceptions: • NO_DATA_FOUNDNO_DATA_FOUND• TOO_MANY_ROWSTOO_MANY_ROWS• INVALID_CURSORINVALID_CURSOR• ZERO_DIVIDEZERO_DIVIDE• DUP_VAL_ON_INDEXDUP_VAL_ON_INDEX
Predefined ExceptionPredefined ExceptionPredefined ExceptionPredefined Exception
BEGIN SELECT ... COMMIT;EXCEPTION WHEN NO_DATA_FOUND THEN statement1; statement2; WHEN TOO_MANY_ROWS THEN statement1; WHEN OTHERS THEN statement1; statement2; statement3;END;
SyntaxSyntax SyntaxSyntax
Trapping Non-Predefined Trapping Non-Predefined Oracle Server ErrorsOracle Server Errors
Trapping Non-Predefined Trapping Non-Predefined Oracle Server ErrorsOracle Server Errors
DeclareDeclare
• Name the Name the exceptionexception
AssociateAssociate
• Code the PRAGMA Code the PRAGMA EXCEPTION_INITEXCEPTION_INIT
Declarative sectionDeclarative section
Reference Reference
• Handle the Handle the raised raised exceptionexception
Exception-handlingException-handlingsectionsection
DECLARE 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;
DECLARE 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;
Non-Predefined ErrorNon-Predefined ErrorNon-Predefined ErrorNon-Predefined Error Trap for Oracle Server error number Trap for Oracle Server error number
–2292, an integrity constraint 2292, an integrity constraint violation.violation.
Trap for Oracle Server error number Trap for Oracle Server error number –2292, an integrity constraint 2292, an integrity constraint violation.violation.
e_emps_remaining EXCEPTION; 1PRAGMA EXCEPTION_INIT (
e_emps_remaining, -2292); 2
e_emps_remaining 3
Trapping User-Defined Trapping User-Defined ExceptionsExceptions
Trapping User-Defined Trapping User-Defined ExceptionsExceptions
• Name the Name the exceptionexception
DeclareDeclare
DeclarativeDeclarativesectionsection
RaiseRaise
• Explicitly raise Explicitly raise the exception by the exception by using the RAISE using the RAISE statementstatement
ExecutableExecutablesectionsection
Reference Reference
• Handle the Handle the raised raised exceptionexception
Exception-handlingException-handlingsectionsection
User-Defined ExceptionUser-Defined ExceptionUser-Defined ExceptionUser-Defined Exception
DECLARE e_invalid_product EXCEPTION;BEGIN UPDATE product SET descrip = '&product_description' WHERE prodid = &product_number; IF SQL%NOTFOUND THEN RAISE e_invalid_product; END IF; COMMIT;EXCEPTION WHEN e_invalid_product THEN DBMS_OUTPUT.PUT_LINE('Invalid product number.');END;
DECLARE e_invalid_product EXCEPTION;BEGIN UPDATE product SET descrip = '&product_description' WHERE prodid = &product_number; IF SQL%NOTFOUND THEN RAISE e_invalid_product; END IF; COMMIT;EXCEPTION WHEN e_invalid_product THEN DBMS_OUTPUT.PUT_LINE('Invalid product number.');END;
ExampleExampleExampleExample
e_invalid_product EXCEPTION; 1
RAISE e_invalid_product; 2
e_invalid_product 3
Functions for Trapping Functions for Trapping ExceptionsExceptions
Functions for Trapping Functions for Trapping ExceptionsExceptions
SQLCODESQLCODEReturns the numeric value for the error codeReturns the numeric value for the error code
SQLERRMSQLERRMReturns the message associated with the error Returns the message associated with the error numbernumber
SQLCODESQLCODEReturns the numeric value for the error codeReturns the numeric value for the error code
SQLERRMSQLERRMReturns the message associated with the error Returns the message associated with the error numbernumber
Functions for Trapping Functions for Trapping ExceptionsExceptions
Functions for Trapping Functions for Trapping ExceptionsExceptions
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 errors VALUES(v_error_code, v_error_message);
END;
ExampleExample ExampleExample
SQLCODESQLERRM
Calling EnvironmentsCalling EnvironmentsCalling EnvironmentsCalling EnvironmentsSQL*Plus
Procedure Builder
OracleDeveloperForms
Precompilerapplication
An enclosing PL/SQL block
Displays error number and message to screen
Displays error number and message to screen
Accesses error number and message
in a trigger by means of the ERROR_CODE and ERROR_TEXT packaged functions
Accesses exception number throughthe SQLCA data structure
Traps exception in exception-handling routine of enclosing block
Propagating ExceptionsPropagating ExceptionsPropagating ExceptionsPropagating Exceptions
BEGIN SELECT ... UPDATE ... IF SQL%NOTFOUND THEN RAISE e_no_rows; END IF;EXCEPTION WHEN e_integrity THEN ... WHEN e_no_rows THEN ...END;
DECLARE . . . e_no_rows exception; e_integrity exception; PRAGMA EXCEPTION_INIT (e_integrity, -2292);BEGIN FOR c_record IN emp_cursor LOOP
END LOOP;EXCEPTION WHEN NO_DATA_FOUND THEN . . . WHEN TOO_MANY_ROWS THEN . . .END;
Subblocks can handle Subblocks can handle an exception or pass an exception or pass the exception to the the exception to the enclosing block.enclosing block.
BEGIN SELECT ... UPDATE ... IF SQL%NOTFOUND THEN RAISE e_no_rows; END IF;EXCEPTION WHEN e_integrity THEN ... WHEN e_no_rows THEN ...END;
RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERRORProcedureProcedure
RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERRORProcedureProcedure
SyntaxSyntax
A procedure that lets you issue user-A procedure that lets you issue user-defined error messages from stored defined error messages from stored subprogramssubprograms
Called only from an executing stored Called only from an executing stored subprogramsubprogram
SyntaxSyntax
A procedure that lets you issue user-A procedure that lets you issue user-defined error messages from stored defined error messages from stored subprogramssubprograms
Called only from an executing stored Called only from an executing stored subprogramsubprogram
raise_application_error (error_number,message[, {TRUE | FALSE}]);
raise_application_error (error_number,message[, {TRUE | FALSE}]);
RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERRORProcedureProcedure
RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERRORProcedureProcedure
Used in two different places:Used in two different places:• Executable sectionExecutable section• Exception sectionException section
Returns error conditions to the user in a Returns error conditions to the user in a manner consistent with other Oracle manner consistent with other Oracle Server errorsServer errors
Used in two different places:Used in two different places:• Executable sectionExecutable section• Exception sectionException section
Returns error conditions to the user in a Returns error conditions to the user in a manner consistent with other Oracle manner consistent with other Oracle Server errorsServer errors
Creating ProceduresCreating ProceduresCreating ProceduresCreating Procedures
Overview of ProceduresOverview of ProceduresOverview of ProceduresOverview of Procedures
A procedure is a named PL/SQL block A procedure is a named PL/SQL block that performs an action.that performs an action.
A procedure can be stored in the A procedure can be stored in the database, as a database object, for database, as a database object, for repeated execution.repeated execution.
A procedure is a named PL/SQL block A procedure is a named PL/SQL block that performs an action.that performs an action.
A procedure can be stored in the A procedure can be stored in the database, as a database object, for database, as a database object, for repeated execution.repeated execution.
Syntax for Creating ProceduresSyntax for Creating ProceduresSyntax for Creating ProceduresSyntax for Creating Procedures
CREATE [OR REPLACE] PROCEDURE procedure_name (argument1 [mode1] datatype1, argument2 [mode2] datatype2, . . .IS [AS]PL/SQL Block;
CREATE [OR REPLACE] PROCEDURE procedure_name (argument1 [mode1] datatype1, argument2 [mode2] datatype2, . . .IS [AS]PL/SQL Block;
Procedural Parameter ModesProcedural Parameter ModesProcedural Parameter ModesProcedural Parameter Modes
CallingCallingenvironmentenvironment
ProcedureProcedure
(DECLARE)(DECLARE)
BEGINBEGIN
EXCEPTIONEXCEPTION
END;END;
IN parameterIN parameter
OUT parameter OUT parameter
IN OUT parameterIN OUT parameter
IN OUT
Must be specified
Passed into subprogram; returned to calling environment
Initialized variable
Must be a variable
OUT
Must be specified
Returned to calling environment
Uninitialized variable
Must be a variable
Parameter Modes for Formal Parameter Modes for Formal ParametersParameters
Parameter Modes for Formal Parameter Modes for Formal ParametersParameters
IN
Default
Value ispassed into subprogram
Formal parameter acts as a constant
Actual parametercan be a literal, expression, constant, orinitialized variable
IN Parameters: ExampleIN Parameters: ExampleIN Parameters: ExampleIN Parameters: Example
SQL> CREATE OR REPLACE PROCEDURE raise_salary 2 (v_id in emp.empno%TYPE) 3 IS 4 BEGIN 5 UPDATE emp 6 SET sal = sal * 1.10 7 WHERE empno = v_id; 8 END raise_salary; 9 /Procedure created.Procedure created.
SQL> EXECUTE raise_salary (7369)PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
SQL> CREATE OR REPLACE PROCEDURE raise_salary 2 (v_id in emp.empno%TYPE) 3 IS 4 BEGIN 5 UPDATE emp 6 SET sal = sal * 1.10 7 WHERE empno = v_id; 8 END raise_salary; 9 /Procedure created.Procedure created.
SQL> EXECUTE raise_salary (7369)PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
v_idv_id73697369
OUT Parameters: ExampleOUT Parameters: ExampleOUT Parameters: ExampleOUT Parameters: Example
Calling environmentCalling environment QUERY_EMP procedureQUERY_EMP procedure
76547654 v_idv_id
v_namev_name
v_salaryv_salary
v_ commv_ comm
MARTINMARTIN
12501250
14001400
IN OUT ParametersIN OUT ParametersIN OUT ParametersIN OUT Parameters
SQL> CREATE OR REPLACE PROCEDURE format_phone 2 (v_phone_no IN OUT VARCHAR2) 3 IS 4 BEGIN 5 v_phone_no := '(' || SUBSTR(v_phone_no,1,3) || 6 ')' || SUBSTR(v_phone_no,4,3) || 7 '-' || SUBSTR(v_phone_no,7); 8 END format_phone; 9 /
Calling environmentCalling environment FORMAT_PHONE procedureFORMAT_PHONE procedure
v_phone_nov_phone_no'(800)633-0575' '(800)633-0575' '(800)633-0575' '(800)633-0575'
Invoking a Procedure from an Invoking a Procedure from an Anonymous PL/SQL BlockAnonymous PL/SQL Block
Invoking a Procedure from an Invoking a Procedure from an Anonymous PL/SQL BlockAnonymous PL/SQL Block
DECLARE v_id NUMBER := 7900;BEGIN raise_salary(v_id); --invoke procedureCOMMIT;...
END;
DECLARE v_id NUMBER := 7900;BEGIN raise_salary(v_id); --invoke procedureCOMMIT;...
END;
Invoking a Procedure from a Invoking a Procedure from a Stored ProcedureStored Procedure
Invoking a Procedure from a Invoking a Procedure from a Stored ProcedureStored Procedure
SQL> CREATE OR REPLACE PROCEDURE process_emps 2 IS 3 CURSOR emp_cursor IS 4 SELECT empno 5 FROM emp; 6 BEGIN 7 FOR emp_rec IN emp_cursor LOOP 8 raise_salary(emp_rec.empno); --invoke procedure 9 END LOOP; 10 COMMIT; 11 END process_emps; 12 /
SQL> CREATE OR REPLACE PROCEDURE process_emps 2 IS 3 CURSOR emp_cursor IS 4 SELECT empno 5 FROM emp; 6 BEGIN 7 FOR emp_rec IN emp_cursor LOOP 8 raise_salary(emp_rec.empno); --invoke procedure 9 END LOOP; 10 COMMIT; 11 END process_emps; 12 /
Removing ProceduresRemoving ProceduresRemoving ProceduresRemoving Procedures
Using SQL*Plus:Using SQL*Plus:
Drop a server-side procedureDrop a server-side procedure
Using SQL*Plus:Using SQL*Plus:
Drop a server-side procedureDrop a server-side procedure
Removing Server-Side Removing Server-Side ProceduresProcedures
Removing Server-Side Removing Server-Side ProceduresProcedures
Using SQL*Plus:Using SQL*Plus: SyntaxSyntax
ExampleExample
Using SQL*Plus:Using SQL*Plus: SyntaxSyntax
ExampleExample
DROP PROCEDURE procedure_nameDROP PROCEDURE procedure_name
SQL> DROP PROCEDURE raise_salary;Procedure dropped.
SQL> DROP PROCEDURE raise_salary;Procedure dropped.
SummarySummarySummarySummary
Exception types:Exception types:• Predefined Oracle Server errorPredefined Oracle Server error• Non-predefined Oracle Server errorNon-predefined Oracle Server error• User-defined errorUser-defined error
Exception trappingException trapping Exception handling:Exception handling:
• Trap the exception within the PL/SQL block.Trap the exception within the PL/SQL block.
• Propagate the exception.Propagate the exception.
Exception types:Exception types:• Predefined Oracle Server errorPredefined Oracle Server error• Non-predefined Oracle Server errorNon-predefined Oracle Server error• User-defined errorUser-defined error
Exception trappingException trapping Exception handling:Exception handling:
• Trap the exception within the PL/SQL block.Trap the exception within the PL/SQL block.
• Propagate the exception.Propagate the exception.
SummarySummarySummarySummary
A procedure is a named PL/SQL block A procedure is a named PL/SQL block that performs an action.that performs an action.
Use parameters to pass data from the Use parameters to pass data from the calling environment to the procedure.calling environment to the procedure.
Procedures can be invoked from any Procedures can be invoked from any tool or language that supports PL/SQL.tool or language that supports PL/SQL.
Procedures can serve as building blocks Procedures can serve as building blocks for an application.for an application.
A procedure is a named PL/SQL block A procedure is a named PL/SQL block that performs an action.that performs an action.
Use parameters to pass data from the Use parameters to pass data from the calling environment to the procedure.calling environment to the procedure.
Procedures can be invoked from any Procedures can be invoked from any tool or language that supports PL/SQL.tool or language that supports PL/SQL.
Procedures can serve as building blocks Procedures can serve as building blocks for an application.for an application.