Tratamiento De Errores Tipos de Errores: De Compilación: Quien se encarga de informar es el copilador PL/SQL y quien se encarga de corregir es el programador. De Ejecución: Quien se encarga de informar es el motor de ejecución PL/SQL, donde las excepciones son generadas e interceptadas por las rutinas de tratamiento de excepciones. Excepciones Tenemos dos tipos de excepciones definidas por el usuario y predefinidas. Esquema General: EXCEPTION WHEN nombre_excepción THEN secuencia_de_instrucciones; WHEN nombre_excepción THEN secuencia_de_instrucciones; [ WHEN OTHERS THEN secuencia_de_instrucciones; ] END; La Sentencia Raise
La sentencia RAISE permite lanzar una excepción en forma explícita. Es posible utilizar esta sentencia en cualquier lugar que se encuentre dentro del alcance de la excepción. DECLARE -- Declaramos una excepcion identificada por VALOR_NEGATIVO VALOR_NEGATIVO EXCEPTION; valor NUMBER; BEGIN -- Ejecucion valor := -1; IF valor < 0 THEN RAISE VALOR_NEGATIVO; END IF; EXCEPTION -- Excepcion WHEN VALOR_NEGATIVO THEN dbms_output.put_line('El valor no puede ser negativo'); END; Excepciones Definidas por el Usuario Una excepción definida por el usuario es definida por el programador. Ejemplo DECLARE e_MuhcosEstudiantes EXCEPTION; e_MuchosEstudiantes, es un identificador que estará visible antes o al final de ese bloque.
Excepciones Predefinida Hay diversas excepciones que corresponden con los errores de Oracle más comunes son: Invalid_Cursor Ocurre cuando se hace referencia a un cursor que esta cerrado. No_Data_Found Ocurre cuando una sentencia SELECT no retorna ninguna fila. DECLARE TYPE t_NumberTableType IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; v_NumberTable t_NumberTableType; v_TempVar NUMBER; BEGIN v_TempVar := v_NumberTable(1); END; Value_Error Ocurre cuando hay conflicto de tipos de datos. DECLARE v_TempVar VARCHAR2(3); BEGIN v_TempVar := 'ABCD'; END; Rowtype_Mismatch Ese tipo de excepción es levantada cuando los tipos de variable de cursor PL/SQL no corresponden. DECLARE e_MuchosEstudiantes EXCEPTION; v_EstudiantesActual NUMBER(3); v_MaxEstudiantes NUMBER(3); BEGIN SELECT current_students, max_students INTO v_EstudiantesActual, v_MaxEstudiantes FROM Clases WHERE departamento = 'HIS' AND curso = 101; IF v_ActualEstudiantes > v_MaxEstudiantes THEN RAISE e_MuchosEstudiantes; END IF; END; Dup_Val_On_Index Una unica restriccion violada. BEGIN INSERT INTO students (id, first_name, last_name) VALUES (20000, 'John', 'Smith'); INSERT INTO students (id, first_name, last_name) VALUES (20000, 'Susan', 'Ryan'); END;DUP_VAL_ON_INDEX: Timeout_On_Resource Se excedió el tiempo máximo en espera por un recurso.
Not_Logged_On El programa efectuó una llamada a Oracle sin estar conectado. Login_Denied El login o la contraseña utilizados para entrar en Oracle son inválidos. Too_Many_Rows Una sentencia SELECT INTO devolvió más de un registro. Zero_Divide Se ha ejecutado una división donde el divisor valía cero. Storage_Error Si no se dispone de más memoria o la memoria esta dañada. Program_Error Ocurrió un problema interno al ejecutar el código PL/SQL. Access_Into_Null Se intentó asignar un valor a los atributos de un objeto no inicializado. Collection_Is_Null Se intentó asignar un valor a una tabla anidada aún no inicializada. Self_Is_Null El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo. Others Cualquier otro tipo de error que pueda producirse. Cuando se utiliza la excepción OTHERS, cualquier excepción que no se haya tratado anteriormente se procesará según la secuencia de instrucciones incluida dentro de la sección OTHERS. OTHERS debe ser la última excepción tratada dentro de la sección dedicada al tratamiento de excepciones.