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.
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.
- Excepciones predefinidas
- 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.
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.
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.
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