manejo de excepciones ing. ricardo carlos inquilla quispe 1

39
Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Upload: domingo-villalpando

Post on 22-Jan-2016

224 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Manejo de Excepciones

Ing. Ricardo Carlos Inquilla Quispe

1

Page 2: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Objetivos de la Sesión

1. Definir qué es un excepción en PL/SQL.

2. Entender los diferentes tipos de excepciones

3. Aplicar las estrategias para controlar adecuadamente las excepciones

2

Page 3: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Temas a tratar

1. Definición y declaración de excepciones.

2. Generación de excepciones.

3. Tratamiento de excepciones

3

Page 4: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Definición y declaración de excepciones

4

Page 5: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Definición de una Definición de una

excepciónexcepción

• Una excepción es un error ocurrido durante la ejecución de un programa PL/SQL.

• Las rutinas de tratamiento de excepciones son los métodos a través el cual el programa reacciona a los errores de ejecución (excepciones).

5

Page 6: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Definición de una excepción(2)Definición de una excepción(2)

• Las excepciones son manejadas en todos los lenguajes de programación de una forma distinta.

• Cuando un error ocurre una excepción se dispara, ya sea que esté o no controlada en el código. Si es controlada en el código se ejecutarán las sentencias bajo la misma, sino se detendrá la ejecución.

6

Page 7: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Definición de una excepciónDefinición de una excepción • Cuando se produce un error, se genera

una excepción. Cuando esto sucede, el control pasa al gestor de excepciones, que es una sección independiente del programa. Esto permite separar la gestión de errores del resto de programa, lo que hace que sea más fácil de entender la lógica de éste, y también asegura que todos los errores serán interceptados.

• Los errores de ejecución incluyen errores SQL y errores procedimentales

7

Page 8: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Errores de Ejecución • Los errores de ejecución son de dos tipos :

1. Errores SQL : Errores generados por el motor de base de datos.ORA-1 : unique constraint violated

2. Errores Procedimentales : Errores generados por la lógica del programa.ORA-06502: PL/SQL: numeric or value error

8

Page 9: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

CREATE SEQUENCE seq_dept

INCREMENT BY 1

START WITH 11

NOMAXVALUE

NOCYCLE

Page 10: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

ExcepcionesExcepcionesDECLARE

v_deptno dept.deptno%TYPE;BEGIN

SELECT seq_dept.NEXTVAL INTO v_deptno FROM DUAL;

-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc) VALUES

(v_deptno,'SISTEMAS','LIMA');

COMMIT;-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('ERROR EN EL SELECT .. INTO');

WHEN DUP_VAL_ON_INDEX THENROLLBACK; DBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR');

END;

DECLARE v_deptno dept.deptno%TYPE;

BEGIN

SELECT seq_dept.NEXTVAL INTO v_deptno FROM DUAL;

-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc) VALUES

(v_deptno,'SISTEMAS','LIMA');

COMMIT;-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('ERROR EN EL SELECT .. INTO');

WHEN DUP_VAL_ON_INDEX THENROLLBACK; DBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR');

END; 10

Page 11: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Declaración de excepciones

• Las excepciones se declaran en la sección declarativa de un bloque, se generan en la sección ejecutable y se tratan en la sección de excepciones.

• Existen dos clases de excepciones: definidas por el usuario y predefinidas.

11

Page 12: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Tipos de excepciones • Excepciones definidas por el usuario :

Una excepción definida por el usuario es un error cuya definición se realiza dentro del programa. El error en cuestión no tiene que ser necesariamente un error Oracle, sino que podría tratarse de un error relativo a los datos.

Se declaran en la sección declarativa de un bloque PL/SQL y tienen asociada el tipo EXCEPTION.

12

Page 13: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Tipos de excepciones • Excepciones definidas por el usuario :

13

Page 14: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

14

Page 15: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Tipos de excepciones

Son las que Oracle ha predefinido para manejar errores clásicos.

Ejemplo :

DUP_VAL_ON_INDEX

INVALID_CURSOR

TOO_MANY_ROWS

NO_DATA_FOUND

15

• Excepciones predefinidas :

Page 16: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Generación de excepciones

16

Page 17: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Generación de excepciones • Una excepción es generada cuando su error asociado se

produce.

Las excepciones definidas por el usuario se generan explícitamente mediante la instrucción RAISE, mientras que las excepciones predefinidas se generan implícitamente cuando ocurre su error Oracle asociado.

• Cuando se genera una excepción el control pasa inmediatamente a la sección de excepciones del bloque PL/SQL.

17

Page 18: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

EjemploDECLARE

v_numdep NUMBER(2);e_MuchosDeps EXCEPTION;

BEGIN

-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc) VALUES (6,'SISTEMAS','LIMA');

-- Validamos el número de departamentosSELECT count(1) INTO v_numdep FROM dept;

IF v_numdep > 5 THEN RAISE e_MuchosDeps;

END IF;

COMMIT;-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION

WHEN DUP_VAL_ON_INDEX THENROLLBACK;DBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR');

WHEN e_MuchosDeps THENROLLBACK;DBMS_OUTPUT.PUT_LINE('Muchos departamentos');

END;

DECLAREv_numdep NUMBER(2);e_MuchosDeps EXCEPTION;

BEGIN

-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc) VALUES (6,'SISTEMAS','LIMA');

-- Validamos el número de departamentosSELECT count(1) INTO v_numdep FROM dept;

IF v_numdep > 5 THEN RAISE e_MuchosDeps;

END IF;

COMMIT;-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION

WHEN DUP_VAL_ON_INDEX THENROLLBACK;DBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR');

WHEN e_MuchosDeps THENROLLBACK;DBMS_OUTPUT.PUT_LINE('Muchos departamentos');

END;

18

Page 19: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

• Crear un bloque plsql que inserte un registro en la tabla dep, en caso la cantidad de registros se encuentre entre 6 Y 8 deberá eliminar el último resgistro que queria insertar y mostrar un mensaje “DATOS INCORRECTOS”. DEBERÁ CREAR UN VARIABLE TIPO EXCEPTION. ADEMAS DEBERÁ MOSTRAR LA CANTIDAD DE REGISTROS INSERTADOS.

Page 20: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Tratamiento de excepciones

20

Page 21: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

• Crear un bloque que cuente la cantidad de empleados que trabajan en , en caso la cantidad sea

Page 22: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Tratamiento de excepciones • Cuando se genera una excepción, el control

pasa a la sección de excepciones del bloque. Esta sección está compuesta por rutinas de tratamiento para las distintas excepciones.

Una rutina de tratamiento de excepciones contiene el código que se ejecutará cuando ocurra el error asociado con la excepción y esta sea generada.

22

Page 23: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Tratamiento de excepciones • Sintaxis :

EXCEPTIONWHEN nombre_excepcion THEN

secuencia_instrucciones1;WHEN nombre_excepcion THEN

secuencia_instrucciones2;[ WHEN OTHERS THEN

secuencia_instrucciones3; ]END;

23

Page 24: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Tratamiento de excepciones • Cada rutina de tratamiento de

excepciones está formada por la cláusula WHEN y las instrucciones que se ejecutarán cuando la excepción sea generada.

• La cláusula WHEN identifica la excepción correspondiente a cada rutina de tratamiento.

24

Page 25: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Cláusula OTHERS • WHEN OTHERS es una rutina de tratamiento

de errores especial. Se ejecutará para todas las excepciones que se generen y no sean tratadas en ninguna otra cláusula WHEN definida en la sección de excepciones actual.

• Debe ser siempre la última rutina de tratamiento del bloque, de modo que las más específicas sean examinadas primero.

25

Page 26: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

SQLCODE y SQLERRM--OTHER http://www.ora-code.com/code-8.html

• Permite identificar dentro de una cláusula OTHERS el error que ocurrió durante la ejecución del programa .

• SQLCODE : Función que devuelve el código de error actual.

• SQLERRM : Función que devuelve el texto del mensaje de error actual.

26

Page 27: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Ejemplo SQLCODE y SQLERRM

DECLAREv_numdep NUMBER(2);

BEGIN

-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc)

--VALUES (seq_dept.NEXTVAL ,'SISTEMAS','LIMA');VALUES (99,'SISTEMAS','LIMAAAAAAAAAAAA');COMMIT;

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION

WHEN DUP_VAL_ON_INDEX THENROLLBACK;DBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR');

WHEN OTHERS THENROLLBACK;DBMS_OUTPUT.PUT_LINE(‘El Codigo de Error

Inesperado ' || SQLCODE || El texto del error es ' || SQLERRM);

END;

DECLAREv_numdep NUMBER(2);

BEGIN

-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc)

--VALUES (seq_dept.NEXTVAL ,'SISTEMAS','LIMA');VALUES (99,'SISTEMAS','LIMAAAAAAAAAAAA');COMMIT;

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION

WHEN DUP_VAL_ON_INDEX THENROLLBACK;DBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR');

WHEN OTHERS THENROLLBACK;DBMS_OUTPUT.PUT_LINE(‘El Codigo de Error

Inesperado ' || SQLCODE || El texto del error es ' || SQLERRM);

END;27

Page 28: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Directiva EXCEPTION_INIT

• Permite manipular excepciones no especificadas en el código del programa.

• En PL/SQL, la directiva EXCEPTION_INIT asocia un nombre de excepción con un número de error de Oracle.

• Sintaxis:PRAGMA EXCEPTION_INIT (nombre_excepcion, error_Oracle)

28

Page 29: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

COMO PONERLE NOMBRE A LOS ERRORES DE ORACLE

Las excepciones sólo pueden ser manejadas por nombre (no por código ORACLE de error).

Para colocarle un nombre a un error de ORACLE, de manera que se le pueda programar un manejador, se emplea la cláusula EXCEPTION_INIT:

Page 30: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

COMO PONERLE NOMBRE A LOS ERRORES ESTABLECIDOS POR ORACLE

PRAGMA EXCEPTION_INIT(<nombre_de_error>, <código_error_ORACLE>);

Ejemplo:DECLAREabrazo_mortal EXCEPTIONPRAGMA EXCEPTION_INIT(abrazo_mortal,-60);

Page 31: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Crea una Excepción y la asigna un código de error de oracle

DECLAREe_ErrorNull2009 EXCEPTION;PRAGMA EXCEPTION_INIT(e_ErrorNull2009,-1400);BEGIN-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc)VALUES (NULL ,'SISTEMAS','LIMA');

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTIONWHEN e_ErrorNull2009 THEN

DBMS_OUTPUT.PUT_LINE('Error Null‘||SQLCODE||'– ‘||SQLERRM);

END;

DECLAREe_ErrorNull2009 EXCEPTION;PRAGMA EXCEPTION_INIT(e_ErrorNull2009,-1400);BEGIN-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc)VALUES (NULL ,'SISTEMAS','LIMA');

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTIONWHEN e_ErrorNull2009 THEN

DBMS_OUTPUT.PUT_LINE('Error Null‘||SQLCODE||'– ‘||SQLERRM);

END;31

Directiva EXCEPTION_INIT

Page 32: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Ejemplo: Captura un error y lo manipulaDECLARE v_numdep NUMBER(2);muchas_letras EXCEPTION;PRAGMA EXCEPTION_INIT(muchas_letras, -12899);BEGININSERT INTO dept (deptno,dname,loc)VALUES (seq_dept.NEXTVAL ,'SISTEMAS','LIMAAAAAAAAAaaaaaaaaaA'); COMMIT;EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR'); WHEN MUCHAS_LETRAS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('DEMASIADOAS LETRAS POR HOY'); WHEN OTHERS THEN

ROLLBACK; DBMS_OUTPUT.PUT_LINE('E- Inesperado ' || SQLCODE || 'SN' || SQLERRM);END;

Page 33: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

RAISE_APPLICATION_ERROR

• Permite crear mensajes más descriptivos para los errores predefinidos de Oracle.

• Sintaxis:

RAISE_APPLICATION_ERROR (número_error, mensaje_error, [preservar_errores])

33

Page 34: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

RAISE_APPLICATION_ERRORBEGIN-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc)VALUES (30 ,'SISTEMAS','LIMA');

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTIONWHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR(-20001,'El departamento que está intentando registrar ya existe’);

END;

BEGIN-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,loc)VALUES (30 ,'SISTEMAS','LIMA');

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTIONWHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR(-20001,'El departamento que está intentando registrar ya existe’);

END;

34

Page 35: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

RESUMEN

• RAISE es para lanzar una excepcion y se utiliza en el bloque de ejecucion.

• RAISE_APPLICATION_ERROR se utiliza en el bloque de Excepciones para mostrar un mensaje personalizado.

Page 36: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Final Sesión

• Preguntas Dudas ?

Muchas Gracias.

36

Page 37: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

Excepciones

• Lista Excepciones

• MOSTRAR TABLA• select table_name from user_tables;• MOSTRAR PROCEDIMIENTOS• select * from user_objectswhere

object_type = ‘PROCEDURE'

37

Page 38: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1

http://www.techonthenet.com/oracle/errors/index.php

Page 39: Manejo de Excepciones Ing. Ricardo Carlos Inquilla Quispe 1