sql >> Base de Datos >  >> RDS >> Database

Aprenda a manejar excepciones en PL/SQL

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

¿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&nbsp; 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.