Si es programador, es posible que esté familiarizado con el concepto de que el manejo de excepciones es una parte integral de cualquier lenguaje de programación. Como los errores son inevitables e incluso el más inteligente de nosotros puede cometer errores al escribir código, debemos saber cómo manejarlos. En este artículo, aprenderemos particularmente sobre el manejo de excepciones en PL/SQL.
A continuación se encuentran los temas tratados en este artículo:
- ¿Qué es una excepción?
- Sintaxis del manejo de excepciones
- Tipos de excepciones
- Definido por el sistema
- Excepciones del sistema con nombre
- Excepciones del sistema sin nombre
- Definido por el usuario
- Pasos para declarar funciones definidas por el usuario
- Ejemplos de funciones definidas por el usuario
- Definido por el sistema
¿Qué es una excepción?
Cualquier condición o evento anormal que interrumpa el flujo normal de las instrucciones de nuestro programa en tiempo de ejecución o, en palabras simples, una excepción es un error.
Sintaxis del manejo de excepciones en PL/SQL
DECLARE <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling goes here > WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........ WHEN others THEN exception3-handling-statements END;
Aquí, podemos enumerar tantas excepciones como queramos manejar. La excepción predeterminada se manejará usando 'CUANDO otros ENTONCES'
Ejemplo de manejo de excepciones en PL/SQL
El siguiente programa muestra el nombre y la dirección de un estudiante cuya identificación se proporciona. Dado que no hay ningún estudiante con valor de ID 8 en nuestra base de datos, el programa genera la excepción de tiempo de ejecución NO_DATA_FOUND, que se captura en el bloque EXCEPTION.
DECLARE s_id studentS.id%type := 8; s_name studentS.Name%type; s_loc studentS.loc%type; BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| s_name); DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such student!'); WHEN others THEN dbms_output.put_line('Oops, Error!'); END;
Salida
No such student! PL/SQL procedure successfully completed.
Aquí, podemos enumerar tantas excepciones como queramos manejar. La excepción predeterminada se manejará usando 'CUANDO otros ENTONCES '
Tipos de excepciones en PL/SQL
- Definido por el sistema
- Usuario desafiado
A continuación, en este artículo sobre el manejo de excepciones en PL/SQL, analicemos estos dos tipos en detalle.
Definido por el sistema
Definidas y mantenidas implícitamente por el servidor de Oracle, estas excepciones se definen principalmente en el paquete estándar de Oracle. Cada vez que ocurre una excepción dentro del programa, el servidor de Oracle compara e identifica la excepción adecuada del conjunto de excepciones disponibles en el paquete estándar de Oracle. Básicamente, estas excepciones están predefinidas en PL/SQL que se genera CUANDO se viola una regla de base de datos en particular .
Las excepciones definidas por el sistema se dividen a su vez en dos categorías:
- Excepciones del sistema con nombre
- Excepciones del sistema sin nombre
Excepciones del sistema con nombre
Las excepciones PL/SQL nombradas son nombradas en el paquete estándar de PL/SQL , por lo tanto, el desarrollador no necesita definir las excepciones PL/SQL en su código. PL/SQL proporciona muchas excepciones nombradas predefinidas, que se ejecutan cuando un programa viola cualquier regla de la base de datos. La siguiente tabla enumera algunas de las importantes excepciones predefinidas −
Excepción | Error de Oracle | CÓDIGO SQL | Descripción |
ACCESO_INTO_NULL | 06530 | -6530 | Se genera cuando a un objeto nulo se le asigna automáticamente un valor. |
CASO_NO_ENCONTRADO | 06592 | -6592 | Se genera cuando no se selecciona ninguna de las opciones en la cláusula WHEN de una instrucción CASE y no hay una cláusula ELSE. |
COLLECTION_IS_NULL | 06531 | -6531 | Se genera cuando un programa intenta aplicar métodos de recopilación distintos de EXISTS a una tabla anidada o varray sin inicializar, o el programa intenta asignar valores a los elementos de una tabla anidada o varray sin inicializar. |
DUP_VAL_ON_INDEX | 00001 | -1 | Se genera cuando se intenta almacenar valores duplicados en una columna con un índice único. |
CURSOR_INVÁLIDO | 01001 | -1001 | Se genera cuando se intenta realizar una operación de cursor que no está permitida, como cerrar un cursor sin abrir. |
INVALID_NUMBER | 01722 | -1722 | Se genera cuando falla la conversión de una cadena de caracteres en un número porque la cadena no representa un número válido. |
LOGIN_DENIED | 01017 | -1017 | Se genera cuando un programa intenta iniciar sesión en la base de datos con un nombre de usuario o contraseña no válidos. |
NO_DATA_FOUND | 01403 | +100 | Se genera cuando una declaración SELECT INTO no devuelve filas. |
NOT_LOGGED_ON | 01012 | -1012 | Se genera cuando se emite una llamada a la base de datos sin estar conectado a la base de datos. |
PROGRAMA_ERROR | 06501 | -6501 | Se genera cuando PL/SQL tiene un problema interno. |
ROWTYPE_MISMATCH | 06504 | -6504 | Se genera cuando un cursor obtiene valor en una variable que tiene un tipo de datos incompatible. |
SELF_IS_NULL | 30625 | -30625 | Se genera cuando se invoca un método miembro, pero la instancia del tipo de objeto no se inicializó. |
ERROR_DE_ALMACENAMIENTO | 06500 | -6500 | Se genera cuando PL/SQL se quedó sin memoria o la memoria se corrompió. |
DEMASIADAS_MANY_ROWS | 01422 | -1422 | Se genera cuando una declaración SELECT INTO devuelve más de una fila. |
VALOR_ERROR | 06502 | -6502 | Se genera cuando se produce un error de aritmética, conversión, truncamiento o restricción de tamaño. |
ZERO_DIVIDE | 01476 | 1476 | Se genera cuando se intenta dividir un número por cero. |
Ejemplo
CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id, student _name ) VALUES ( student _id_in, student _name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,'Duplicate student _id'); WHEN OTHERS THEN raise_application_error (-20002,'An error occurred.'); END;
Continuando con este artículo sobre el manejo de excepciones en PL/SQL, comprendamos qué son las excepciones del sistema sin nombre.
Excepciones del sistema sin nombre
Las excepciones del sistema para las que Oracle no tiene un nombre se conocen como excepciones del sistema sin nombre. Estas excepciones no ocurren con frecuencia y se escriben con un código y un mensaje asociado.
Básicamente, existen dos formas de manejar las excepciones del sistema sin nombre:
1. Usar el controlador de excepciones CUANDO OTROS
2. Asociar el código de excepción a un nombre y usarlo como una excepción con nombre.
Algunos pasos seguidos para las excepciones del sistema sin nombre son:
- Elévelos implícitamente.
- En caso de que no se manejen en 'CUANDO Otros' entonces, deben manejarse explícitamente.
- Para manejar la excepción explícitamente, se pueden declarar usando Pragma EXCEPTION_INIT y manejarse haciendo referencia al nombre de excepción definido por el usuario en la sección de excepciones.
Más adelante en este artículo se proporciona un ejemplo de manejo de excepciones sin nombre mediante Pragma EXCEPTION_INIT. Continuando con este artículo sobre el manejo de excepciones en PL/SQL, comprendamos las excepciones definidas por el usuario.
Definido por el usuario
Al igual que todos los demás lenguajes de programación, Oracle también le permite declarar e implementar sus propias excepciones. A diferencia de las excepciones definidas por el sistema, estas excepciones se generan explícitamente en el bloque PL/SQL.
Pasos para declarar excepciones definidas por el usuario en la base de datos de Oracle
Podemos definir excepciones definidas por el usuario en la base de datos Oracle de las siguientes 3 formas:
- Uso de variable de tipo EXCEPCIÓN
Aquí, podemos declarar una excepción definida por el usuario declarando una variable de tipo de datos EXCEPTION en nuestro código y generarla explícitamente en nuestro programa usando la instrucción RAISE.
- Uso de la función PRAGMA EXCEPTION_INIT
Podemos definir un número de error no predefinido con la variable de tipo de datos EXCEPTION
- Usando el método RAISE_APPLICATION_ERROR
Con este método, podemos declarar una excepción definida por el usuario con nuestro propio número y mensaje de error personalizados.
Hasta ahora, es posible que tenga una idea aproximada de las formas en que podemos generar excepciones definidas por el usuario en PL/SQL. Aprenderemos sobre cada uno de los métodos mencionados anteriormente con ejemplos más adelante en este artículo sobre el manejo de excepciones en PL/SQL.
A continuación en este artículo, procedamos con las demostraciones del manejo de excepciones definidas por el usuario.
Demostración de excepciones definidas por el usuario
Continuando con este artículo sobre Manejo de excepciones en PL/SQL, comprendamos cómo usar la variable de tipo EXCEPCIÓN.
Uso de variable de tipo EXCEPCIÓN
El proceso de declarar una excepción definida por el usuario se divide en tres partes y estas 3 partes son:
- Declarar un tipo de datos de excepción variable
- Generar la excepción
- Manejar la excepción
Escribamos un código para demostrar los pasos anteriores en detalle.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
En el bloque de declaración anterior, tenemos cuatro variables, entre las cuales las tres primeras son variables de tipo de datos de números normales y la cuarta, que es ex_DivZero, es la variable de tipo de datos de excepción especial. La cuarta es nuestra excepción definida por el usuario.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
La parte de ejecución anterior de este bloque anónimo entrará en acción solo cuando el divisor sea 0. Si el divisor es cero como en nuestro caso, se generará el error. y el control del programa omitirá todos los pasos siguientes y buscará un controlador de excepciones coincidente. En el caso de que encuentre cualquier otro, realizará la acción correspondiente; de lo contrario, finalizará el programa o nos avisará con un error definido por el sistema no controlado.
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
Este es el controlador de excepciones. Tan pronto como el usuario ingrese el divisor como 0, se le solicitará la cadena de mensaje anterior.
Código final:
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); END;
Continuando con este artículo sobre el manejo de excepciones en PL/SQL, comprendamos cómo usar el método PRAGMA_EXCEPTION_INIT.
Uso de la función PRAGMA EXCEPTION_INIT
En la función PRAGMA EXCEPTION_INIT, un nombre de excepción está asociado con un número de error de Oracle. Este nombre se puede utilizar para diseñar el controlador de excepciones para el error. Para proyectos grandes con muchos errores definidos por el usuario, PRAGMA EXCEPTION_INIT es el método más útil y adecuado.
Sintaxis:
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
Ejemplo
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN NULL; -- Some operation that causes an ORA-00060 error EXCEPTION WHEN deadlock_detected THEN NULL; -- handle the error END;
PRAGMA EXCEPTION_INIT le dice al compilador que asocie un nombre de excepción con un número de error de Oracle como se mencionó anteriormente. Le permite hacer referencia a cualquier excepción interna por su nombre y escribir un controlador específico para ella. Cuando ve una pila de errores o una secuencia de mensajes de error, el que está en la parte superior es el que puede atraparse y manejarse.
Continuando con este artículo sobre Manejo de excepciones en PL/SQL, comprendamos cómo usar el método RAISE_APPLICATION_ERROR.
Uso del método RAISE_APPLICATION_ERROR
Es un procedimiento que viene integrado con el software de Oracle. Usando este procedimiento podemos asociar un número de error con un mensaje de error personalizado. Combinando el número de error y el mensaje de error personalizado, se puede componer una cadena de error que se parece a las cadenas de error predeterminadas que Oracle muestra cuando se encuentra un error. El procedimiento RAISE_APPLICATION_ERROR se encuentra dentro del paquete DBMS_STANDARD
Sintaxis
raise_application_error (error_number, message [, {TRUE | FALSE}]);
Ejemplo
/* A trigger trg_emp_detail_chk is created.*/ CREATE OR REPLACE TRIGGER trg_emp_detail_chk /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/ Before UPDATE ON employees DECLARE permission_denied EXCEPTION; BEGIN /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/ IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!'); /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter with a default text stating that the user is not authorized to do any modification in the weekends. */ END IF; END;
Con esto llegamos al final de este artículo sobre “Manejo de excepciones en PL/SQL”. Espero que este tema se entienda bien y te haya ayudado. Intente escribir sus propios códigos e incorpore los métodos explicados en este artículo.
Si quieres capacitarte de profesionales en esta tecnología, ¡puedes optar por la capacitación estructurada de edureka! Eche un vistazo a esta capacitación de certificación MySQL DBA de Edureka, una empresa de aprendizaje en línea confiable con una red de más de 250,000 estudiantes satisfechos repartidos por todo el mundo. Este curso lo capacita en los conceptos básicos y las herramientas y técnicas avanzadas para administrar datos y administrar la base de datos MySQL. Incluye aprendizaje práctico sobre conceptos como MySQL Workbench, MySQL Server, modelado de datos, MySQL Connector, diseño de bases de datos, línea de comandos MySQL, funciones MySQL, etc. Al final de la capacitación, podrá crear y administrar su propia base de datos MySQL y administrar datos.
¿Tienes alguna pregunta para nosotros? Menciónelo en la sección de comentarios de este artículo "Manejo de excepciones en PL/SQL" y nos pondremos en contacto con usted lo antes posible.