Manejo de excepciones en Oracle PL/SQL (Ejemplos)

¿Qué es el manejo de excepciones en PL/SQL?

Se produce una excepción cuando el motor PL/SQL encuentra una instrucción que no puede ejecutar debido a un error que ocurre en tiempo de ejecución. Estos errores no se capturarán en el momento de la compilación y, por lo tanto, es necesario manejarlos solo en el tiempo de ejecución.

Por ejemplo, si el motor PL/SQL recibe una instrucción para dividir cualquier número entre "0", entonces el motor PL/SQL la generará como una excepción. La excepción solo la genera el motor PL/SQL en tiempo de ejecución.

Las excepciones impedirán que el programa siga ejecutándose, por lo que, para evitar dicha condición, es necesario capturarlas y manejarlas por separado. Este proceso se denomina manejo de excepciones, en el que el programador maneja la excepción que puede ocurrir en el tiempo de ejecución.

Sintaxis de manejo de excepciones

Las excepciones se manejan a nivel de bloque, es decir, una vez que ocurre alguna excepción en cualquier bloque, el control saldrá de la parte de ejecución de ese bloque. Luego, la excepción se manejará en la parte de manejo de excepciones de ese bloque. Después de manejar la excepción, no es posible reenviar el control a la sección de ejecución de ese bloque.

La siguiente sintaxis explica cómo detectar y manejar la excepción.

Manejo de excepciones en PL/SQL

BEGIN
<execution block>
.
.
EXCEPTION
WHEN <exceptionl_name>
THEN
  <Exception handling code for the “exception 1 _name’' >
WHEN OTHERS
THEN
  <Default exception handling code for all exceptions >
END;

Explicación de sintaxis:

  • En la sintaxis anterior, el bloque de manejo de excepciones contiene una serie de condiciones CUÁNDO para manejar la excepción.
  • Cada condición WHEN va seguida del nombre de la excepción que se espera que se genere en tiempo de ejecución.
  • Cuando se genera cualquier excepción en tiempo de ejecución, el motor PL/SQL buscará en la parte de manejo de excepciones esa excepción en particular. Comenzará desde la primera cláusula 'CUÁNDO' y, secuencialmente, buscará.
  • Si encontró el manejo de excepciones para la excepción que se generó, ejecutará esa parte del código de manejo en particular.
  • Si ninguna de las cláusulas "CUANDO" está presente para la excepción que se ha generado, entonces el motor PL/SQL ejecutará la parte "CUANDO OTROS" (si está presente). Esto es común a todas las excepciones.
  • Después de ejecutar la excepción, el control parcial saldrá del bloque actual.
  • Solo se puede ejecutar una parte de excepción para un bloque en tiempo de ejecución. Después de ejecutarlo, el controlador omitirá la parte restante del manejo de excepciones y saldrá del bloque actual.

Nota: CUANDO OTROS siempre debe estar en la última posición de la secuencia. La parte de manejo de excepciones presente después de WHEN OTHERS nunca se ejecutará ya que el control saldrá del bloque después de ejecutar WHEN OTHERS.

Tipos de excepción

Hay dos tipos de excepciones en Pl/SQL.

  1. Excepciones predefinidas
  2. Excepción definida por el usuario

Excepciones predefinidas

Oracle ha predefinido alguna excepción común. Estas excepciones tienen un nombre de excepción y un número de error únicos. Estas excepciones ya están definidas en el paquete 'STANDARD' en Oracle. En el código, podemos usar directamente estos nombres de excepción predefinidos para manejarlos.

A continuación se muestran las pocas excepciones predefinidas.

Excepción Código de error Razón de excepción
ACCESO_INTO_NULL ORA-06530 Asignar un valor a los atributos de objetos no inicializados
CASO_NO_ENCONTRADO ORA-06592 Ninguna de las cláusulas 'WHEN' en la declaración CASE se cumple y no se especifica ninguna cláusula 'ELSE'
COLLECTION_IS_NULL ORA-06531 Usar métodos de colección (excepto EXISTS) o acceder a atributos de colección en colecciones no inicializadas
CURSOR_ALREADY_OPEN ORA-06511 Tratando de abrir un cursor que ya esta abierto
DUP_VAL_ON_INDEX ORA-00001 Almacenar un valor duplicado en una columna de base de datos que está restringida por un índice único
INVALID_CURSOR ORA-01001 Operaciones ilegales del cursor como cerrar un cursor sin abrir
NÚMERO INVALIDO ORA-01722 La conversión de un carácter a un número falló debido a un carácter numérico no válido
DATOS NO ENCONTRADOS ORA-01403 Cuando la declaración 'SELECT' que contiene la cláusula INTO no recupera filas.
ROW_MISCATCH ORA-06504 Cuando el tipo de datos de la variable del cursor es incompatible con el tipo de retorno del cursor real
SUBSCRIPT_BEYOND_COUNT ORA-06533 Hacer referencia a la colección mediante un número de índice que es mayor que el tamaño de la colección
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Hacer referencia a la colección mediante un número de índice que está fuera del rango legal (por ejemplo: -1)
TOO_MANY_ROWS ORA-01422 Cuando una declaración 'SELECT' con cláusula INTO devuelve más de una fila
VALOR_ERROR ORA-06502 Error aritmético o de restricción de tamaño (por ejemplo: asignar un valor a una variable que es mayor que el tamaño de la variable)
ZERO_DIVIDE ORA-01476 Dividir un número por '0'

Excepción definida por el usuario

In OracleAdemás de las excepciones predefinidas anteriormente, el programador puede crear su propia excepción y manejarlas. Se pueden crear a nivel de subprograma en la parte de declaración. Estas excepciones son visibles sólo en ese subprograma. La excepción definida en la especificación del paquete es una excepción pública y es visible dondequiera que se pueda acceder al paquete.

Sintaxis: A nivel de subprograma

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • En la sintaxis anterior, la variable "nombre_excepción" se define como tipo "EXCEPCIÓN".
  • Esto se puede utilizar de forma similar a una excepción predefinida.

Sintaxis:En el nivel de especificación del paquete

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • En la sintaxis anterior, la variable 'nombre_excepción' se define como tipo 'EXCEPCIÓN' en la especificación del paquete de .
  • Esto se puede utilizar en la base de datos dondequiera que se pueda llamar al paquete 'nombre_paquete'.

Excepción de aumento de PL/SQL

Todas las excepciones predefinidas se generan implícitamente cada vez que se produce el error. Pero las excepciones definidas por el usuario deben plantearse explícitamente. Esto se puede lograr utilizando la palabra clave "RAISE". Esto se puede utilizar de cualquiera de las formas que se mencionan a continuación.

Si 'RAISE' se usa por separado en el programa, propagará la excepción ya generada al bloque principal. Solo se puede utilizar en el bloque de excepción, como se muestra a continuación.

Excepción de aumento de PL/SQL

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Explicación de sintaxis:

  • En la sintaxis anterior, la palabra clave RAISE se utiliza en el bloque de manejo de excepciones.
  • Siempre que el programa encuentra la excepción "nombre_excepción", la excepción se maneja y se completará normalmente
  • Pero la palabra clave "RAISE" en la parte de manejo de excepciones propagará esta excepción particular al programa principal.

Nota: Al generar la excepción al bloque padre, la excepción que se genera también debe ser visible en el bloque padre; de ​​lo contrario, Oracle generará un error.

  • Podemos usar la palabra clave "RAISE" seguida del nombre de la excepción para generar esa excepción particular definida por el usuario/predefinida. Esto se puede utilizar tanto en la parte de ejecución como en la parte de manejo de excepciones para generar la excepción.

Excepción de aumento de PL/SQL

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

Explicación de sintaxis:

  • En la sintaxis anterior, la palabra clave RAISE se utiliza en la parte de ejecución seguida de la excepción "nombre_excepción".
  • Esto generará esta excepción particular en el momento de la ejecución, y esto debe manejarse o plantearse más.

Ejemplo : En este ejemplo, vamos a ver

  • Cómo declarar la excepción
  • Cómo plantear la excepción declarada y
  • Cómo propagarlo al bloque principal.

Excepción de aumento de PL/SQL

Excepción de aumento de PL/SQL

DECLARE
Sample_exception EXCEPTION;
PROCEDURE nested_block
IS
BEGIN
Dbms_output.put_line(‘Inside nested block’);
Dbms_output.put_line(‘Raising sample_exception from nested block’);
RAISE sample_exception;
EXCEPTION
WHEN sample_exception THEN 
Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’);
RAISE,
END;
BEGIN
Dbms_output.put_line(‘Inside main block’);
Dbms_output.put_line(‘Calling nested block’);
Nested_block;
EXCEPTION
WHEN sample_exception THEN	
Dbms_output.put_line (‘Exception captured in main block');
END:
/

Explicación del código:

  • Línea de código 2: Declarar la variable 'sample_exception' como tipo EXCEPCIÓN.
  • Línea de código 3: Procedimiento de declaración nested_block.
  • Línea de código 6: Imprimiendo la declaración “Dentro del bloque anidado”.
  • Línea de código 7: Imprimiendo la declaración "Elevando sample_exception desde un bloque anidado".
  • Línea de código 8: Generar la excepción usando 'RAISE sample_exception'.
  • Línea de código 10: Manejador de excepciones para la excepción sample_exception en el bloque anidado.
  • Línea de código 11: Imprimiendo la declaración 'Excepción capturada en bloque anidado. Elevando al bloque principal”.
  • Línea de código 12: Generar la excepción al bloque principal (propagarla al bloque principal).
  • Línea de código 15: Imprimiendo la declaración “Dentro del bloque principal”.
  • Línea de código 16: Imprimiendo la declaración "Llamando al bloque anidado".
  • Línea de código 17: Llamando al procedimiento nested_block.
  • Línea de código 18: Excepción
  • Línea de código 19: Manejador de excepciones para sample_exception en el bloque principal.
  • Línea de código 20: Imprimiendo la declaración "Excepción capturada en el bloque principal".

Puntos importantes a tener en cuenta en la excepción

  • En función, una excepción siempre debe devolver un valor o aumentar aún más la excepción. demás Oracle arrojará el error 'Función devuelta sin valor' en tiempo de ejecución.
  • Las declaraciones de control de transacciones se pueden proporcionar en el bloque de manejo de excepciones.
  • SQLERRM y SQLCODE son las funciones integradas que proporcionarán el mensaje y el código de excepción.
  • Si no se maneja una excepción, de forma predeterminada se revertirán todas las transacciones activas en esa sesión.
  • RAISE_APPLICATION_ERROR (-, ) se puede usar en lugar de RAISE para generar el error con el código de usuario y el mensaje. El código de error debe ser mayor que 20000 y tener el prefijo '-'.

Resum

Después de este capítulo, deberías poder trabajar en los siguientes aspectos de Pl SQL excepciones

  • Manejando las excepciones
  • Definir una excepción
  • Plantear la excepción
  • Propagación de excepciones