sesion09 - manejo de excepciones (oracle)

7
/* Sesión10 – Manejo de Excepciones Estudiante: José Luis Toro Alcarraz Curso: Base de Datos Avanzado II Correo:[email protected] */ Objetivos de la sesión. Definir qué es un excepción en PL/SQL. Entender los diferentes tipos de excepciones. Conocer las estrategias para controlar adecuadamente las excepciones. 1) Definición y declaración de excepciones 2) Generación de excepciones 3) Tratamiento de excepciones 4) Propagación de excepciones 1) Definición y declaración de excepciones. 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). 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. 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. a) Errores de ejecución

Upload: jose-toro

Post on 12-Jun-2015

1.293 views

Category:

Education


3 download

DESCRIPTION

Este minitutorial tiene como objetivo captar todos los conceptos dictados en cada sesión en el curso de Base de Datos Avanzado II, así como brindar apoyo a los alumnos de la carrera técnica de Computación e Informática, que por algún motivo no hayan asistido a clases. UNIDAD 4. Programación en Oracle Logro de la Unidad de Aprendizaje Al término de la unidad, el alumno construye programas estructurados utilizando el lenguaje PL/SQL dentro del manejador de base de datos Oracle. Incorpora cursores para procesar grandes volúmenes de información y gestiona los posibles errores de ejecución con el uso de excepciones. Temario 4.4 Tema 9: EXCEPCIONES EN PL/SQL 4.4.1 ¿Qué es una Excepción? 4.4.2 Declaración de Excepciones 4.4.3 Generación de Excepciones 4.4.4 Tratamiento de Excepciones 4.4.5 Propagación de Excepciones

TRANSCRIPT

Page 1: Sesion09 - Manejo de Excepciones (Oracle)

/* Sesión10 – Manejo de ExcepcionesEstudiante: José Luis Toro AlcarrazCurso: Base de Datos Avanzado IICorreo:[email protected]*/

Objetivos de la sesión.

Definir qué es un excepción en PL/SQL. Entender los diferentes tipos de excepciones. Conocer las estrategias para controlar adecuadamente las excepciones.

1) Definición y declaración de excepciones2) Generación de excepciones3) Tratamiento de excepciones4) Propagación de excepciones

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

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). 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.

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.

a) Errores de ejecución

Los errores de ejecución son de dos tipos : Errores SQL: Errores generados por el motor de base de datos. ORA-1 : unique constraint violated Errores Procedimentales: Errores generados por la lógica del programa. ORA-06502: PL/SQL: numeric or value error

Ejemplo:

DECLAREv_deptno dept.deptno%TYPE;

BEGIN

SELECT seq_dept.NEXTVAL INTO v_deptno FROM DUAL;

Page 2: Sesion09 - Manejo de Excepciones (Oracle)

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

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION

WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('ERROR EN EL SELECT .. INTO');

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

END;/

b) 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.

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.

Ejemplo:

DECLAREv_numemp NUMBER(2);e_MuchosEmp EXCEPTION;

BEGINSELECT count(1) INTO v_numemp FROM emp;

IF v_numemp > 10 THEN RAISE e_MuchosEmp;

END IF; DBMS_OUTPUT.PUT_LINE('Hay ' || v_numemp || ' empleados');

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION

WHEN e_MuchosEmp THENDBMS_OUTPUT.PUT_LINE('Muchos empleados');

END;

Page 3: Sesion09 - Manejo de Excepciones (Oracle)

/

Excepciones predefinidas:

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

Ejemplo:

DUP_VAL_ON_INDEX(pk ya existe) INVALID_CURSOR(error procesamiento de cursores) TOO_MANY_ROWS(select into devuelve mas de una fila) NO_DATA_FOUND(select into no devuelve data)

2) 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.

Ejemplo:

DECLAREv_numdep NUMBER(2);e_MuchosDeps EXCEPTION;

BEGIN-- Añade una fila a la tabla deptINSERT INTO dept (deptno,dname,local)VALUES (seq_dept.NEXTVAL ,'SISTEMAS','LIMA');-- Validamos el número de departamentos SELECT 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;/

Page 4: Sesion09 - Manejo de Excepciones (Oracle)

3) 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

Sintaxis:EXCEPTION

WHEN nombre_excepcion THENsecuencia_instrucciones1;

WHEN nombre_excepcion THENsecuencia_instrucciones2;

[ WHEN OTHERS THENsecuencia_instrucciones3; ]

END;

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.

4) Propagación de excepciones.

a) 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.

a) SQLCODE SQLERRM

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.

b) 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])

Page 5: Sesion09 - Manejo de Excepciones (Oracle)

Problema1: Ingresar un nuevo departamento y guardar en un tabla los errores generados

DECLAREV_NUMDEP NUMBER(2);

BEGIN-- Añade una fila a la tabla departamentoINSERT INTO DEPT (DEPTNO,DNAME,LOCAL)VALUES (SEQ_DEPT.NEXTVAL ,'SISTEMAS','LIMA');

COMMIT;

-- ZONA DE TRATAMIENTO DE EXCEPCIONESEXCEPTION

WHEN DUP_VAL_ON_INDEX THENDBMS_OUTPUT.PUT_LINE('NO PUDO INSERTAR');

WHEN OTHERS THENROLLBACK;

-- Insertamos el error en la tabla LOG_ERRORINSERT INTO LOG_ERROR(CODERROR,DESCRIPCION,FECHA,PROGRANA,USUARIO)VALUES(SQLCODE,SQLERRM,SYSDATE,'AAAA',USER);

DBMS_OUTPUT.PUT_LINE('ERROR INESPERADO ' || SQLCODE || ' – ' || SQLERRM);END;/

Excepciones predefinidas vistas hasta ahora:

WHEN SQL%NOTFOUND THEN No se encuentra el SQLWHEN NOT_DATA_FOUND THEN NO hay datosWHEN ZERO_DIVIDE THEN Cuando se divide entre ceroWHEN OTHERS THEN Otros errorsWHEN DUP_VAL_ON_INDEX THEN -> Si la PK ya existe, cuando no se pudo insertar el registroWHEN INVALID_CURSOR THEN --> Error procesamiento de cursoresWHEN TOO_MANY_ROWS THEN --> select into devuelve mas de una filaWHEN DATA_FOUND THEN --> select into no devuelve data