Manejo de excepciones de Oracle PL / SQL: ejemplos para generar una excepción definida por el usuario

Tabla de contenido:

Anonim

¿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 se produce en tiempo de ejecución. Estos errores no se capturarán en el momento de la compilación y, por lo tanto, deben manejarse solo en el tiempo de ejecución.

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

Las excepciones evitarán que el programa se ejecute más, por lo que para evitar tal condición, deben capturarse y manejarse por separado. Este proceso se denomina Manejo de excepciones, en el cual el programador maneja la excepción que puede ocurrir en el tiempo de ejecución.

En este tutorial, aprenderá los siguientes temas:

  • Sintaxis de manejo de excepciones
  • Tipos de excepciones
  • Excepciones predefinidas
  • Excepción definida por el usuario
  • Excepción de aumento de PL / SQL
  • Puntos importantes a tener en cuenta en la excepció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 ejecución de la parte de ese bloque. Entonces, 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 volver a enviar el control a la sección de ejecución de ese bloque.

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

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Explicación de la sintaxis:

  • En la sintaxis anterior, el bloque de manejo de excepciones contiene una serie de condiciones WHEN para manejar la excepción.
  • Cada condición WHEN va seguida del nombre de la excepción que se espera que se genere en el tiempo de ejecución.
  • Cuando se genera una excepción en tiempo de ejecución, el motor PL / SQL buscará esa excepción en particular en la parte de manejo de excepciones. Comenzará desde la primera cláusula 'WHEN' y, secuencialmente, buscará.
  • Si encuentra el manejo de excepciones para la excepción que se ha generado, entonces ejecutará esa parte del código de manejo en particular.
  • Si ninguna de las cláusulas 'WHEN' está presente para la excepción que se ha generado, entonces el motor PL / SQL ejecutará la parte 'WHEN OTHERS' (si está presente). Esto es común para todas las excepciones.
  • Después de ejecutar la excepción, el control de piezas 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 de manejo de excepciones restante y saldrá del bloque actual.

Nota: CUANDO OTROS siempre deben 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 excepciones

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 'ESTÁNDAR' en Oracle. En el código, podemos usar directamente estos nombres de excepción predefinidos para manejarlos.

A continuación se muestran algunas excepciones predefinidas.

Excepción Código de error Razón de la excepción
ACCESS_INTO_NULL ORA-06530 Asignar un valor a los atributos de objetos no inicializados
CASE_NOT_FOUND ORA-06592 Ninguna de las cláusulas 'WHEN' de la sentencia 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 Intentando abrir un cursor que ya está abierto
DUP_VAL_ON_INDEX ORA-00001 Almacenar un valor duplicado en una columna de la base de datos que está restringida por un índice único
INVALID_CURSOR ORA-01001 Operaciones de cursor ilegales 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 de número no válido
DATOS NO ENCONTRADOS ORA-01403 Cuando la instrucción 'SELECT' que contiene la cláusula INTO no recupera filas.
ROW_MISMATCH 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 Referencia a la colección por un número de índice que es mayor que el tamaño de la colección
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Referenciar colección por 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 la cláusula INTO devuelve más de una fila
VALUE_ERROR ORA-06502 Error de restricción aritmética o de tamaño (por ejemplo: asignar un valor a una variable que es más grande que el tamaño de la variable)
ZERO_DIVIDE ORA-01476 Dividir un número por '0'

Excepción definida por el usuario

En Oracle, aparte 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 solo en ese subprograma. La excepción que se define 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;BEGINEXCEPTIONWHEN  THENEND;
  • 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 de paquete

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • 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 usar 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 siempre 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 padre. Solo en el bloque de excepción se puede utilizar como se muestra a continuación.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Explicación de la sintaxis:

  • En la sintaxis anterior, la palabra clave RAISE se usa en el bloque de manejo de excepciones.
  • Siempre que el programa encuentra la excepción "exception_name", 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: Mientras se genera la excepción al bloque principal, la excepción que se genera también debería estar visible en el bloque principal, de lo contrario, Oracle arrojará un error.

  • Podemos usar la palabra clave 'RAISE' seguida del nombre de la excepción para generar esa excepción definida por el usuario / predefinida en particular. Esto se puede usar tanto en la parte de ejecución como en la parte de manejo de excepciones para generar la excepción.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Explicación de la sintaxis:

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

Ejemplo 1 : En este ejemplo, veremos

  • Cómo declarar la excepción
  • Cómo generar la excepción declarada y
  • Cómo propagarlo al bloque principal.
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Explicación del código:

  • Línea de código 2 : Declarando la variable 'sample_exception' como tipo EXCEPTION.
  • Línea de código 3 : procedimiento de declaración nested_block.
  • Línea de código 6 : Impresión de la declaración "Dentro del bloque anidado".
  • Línea de código 7: Impresión de la declaración "Generando sample_exception desde bloque anidado".
  • Línea de código 8: Generando 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: Impresión de la declaración 'Excepción capturada en bloque anidado. Elevación al bloque principal '.
  • Línea de código 12: Generando la excepción al bloque principal (propagándose al bloque principal).
  • Línea de código 15: Impresión de la declaración "Dentro del bloque principal".
  • Línea de código 16: Impresión de la instrucción "Llamando bloque anidado".
  • Línea de código 17: Llamando al procedimiento nested_block.
  • Línea de código 19: manejador de excepciones para sample_exception en el bloque principal.
  • Línea de código 20: Impresión de 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 generar más la excepción. de lo contrario, Oracle arrojará el error 'Función devuelta sin un valor' en tiempo de ejecución.
  • Las declaraciones de control de transacciones se pueden dar en el bloque de manejo de excepciones.
  • SQLERRM y SQLCODE son las funciones integradas que darán el mensaje y el código de excepción.
  • Si no se maneja una excepción, de manera predeterminada, todas las transacciones activas en esa sesión se revertirán.
  • RAISE_APPLICATION_ERROR (- , ) se puede utilizar 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 '-'.

Resumen

Después de este capítulo. debería poder trabajar para los siguientes aspectos de las excepciones Pl SQL

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