Está en la página 1de 12

EXCEPCIONES EN

PL/SQL
El control de excepciones es el mecanismo del
PL/SQL para manejar errores de tiempo de
ejecución. El utilizar este mecanismo permite
continuar la ejecución del programa, si el error
no es muy grave, lo cual quedaría a decisión del
programador.
EXCEPCIONES EN
PL/SQL
Usted debe definir el manejador de la excepción
dentro de la especificación del programa o
bloque. Cuando un error de programa ocurre el
control se pasa al bloque de manejo de
excepciones, luego de lo cual se regresa el
control al que invoca al programa o bien termina
según lo defina el programador.
Excepciones definidas por
el usuario
PLSQL permite al usuario definir sus propias excepciones. Estas
excepciones deben ser declaradas y lanzadas explícitamente utilizando
la sentencia RAISE. Este tipo de excepciones deben ser declaradas en
el segmento DECLARE. Se declara una excepción como cualquier otra
variable, asignandole el tipo EXCEPTION. Como las variables, una
excepción declarada en un bloque es local a ese bloque y global a
todos los sub-bloques que comprende.

También existe un procedimiento estándar de PL/SQL que permite


lanzar errores y definir y enviar un mensaje de error. Su formato es el
siguiente:

   RAISE_APPLICATION_ERROR (número de error, mensaje de


error);

Cuando desde un programa se realiza una llamada a este


procedimiento, se lanza una excepción y se deshacen todos los
cambios realizados por el programa sobre la base de datos Oracle.
Excepciones definidas por
Ejemplo: el usuario
   DECLARE
     vprecio inventario.precio%TYPE;
     barato EXCEPTION;
   BEGIN
     [Otras sentencias]
     BEGIN
       SELECT precio FROM inventario
       WHERE articulo = 'tvplasma'
       INTO vprecio;
       IF vprecio < 100 THEN
         RAISE barato;
       END IF;
       EXCEPTION
       WHEN NO_DATA_FOUND THEN
         RAISE_APPLICATION_ERROR (-20001, 'Sin TV de plasma');
Excepciones definidas por
el usuario
WHEN TOO_MANY_ROWS THEN
         RAISE_APPLICATION_ERROR (-20002, 'Muchas TV de
plasma');
       WHEN barato THEN
         DBMS_OUTPUT.PUT_LINE("El articulo es muy barato.");
         UPDATE inventario
         SET precio = precio + 100
         WHERE articulo = 'tvplasma';
         DBMS_OUTPUT.PUT_LINE("Precio subido 100 euros");
       WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE("Error, abortando ejecución.");
         RAISE;
     END;
     [Otras sentencias]
   END;
Excepciones definidas por
el usuario
En este ejemplo si la sentencia SELECT INTO fallase por no devolver
ningún registro (NO_DATA_FOUND) o por devolver más de uno
(TOO_MANY_ROWS), se lanzaría un error con los mensajes
especificados en el procedimiento RAISE_APPLICATION_ERROR
deteniéndose la ejecución del programa. Si el precio del artículo
buscado (tvplasma) fuera menor de 100 euros, entonces se
actualizaría el precio del artículo sumándo 100 euros al precio original
y la ejecución del programa continuaría. Para cualquier otro error, se
mandaría un mensaje de error a la pantalla y la ejecución del programa
se abortaría.
Excepciones definidas por
el sistema
Excepcion Se ejecuta ... SQLCODE
El programa intentó
asignar valores a los
ACCESS_INTO_NULL -6530
atributos de un objeto
no inicializado
El programa intentó
COLLECTION_IS_NU asignar valores a una
-6531
LL tabla anidada aún no
inicializada
El programa intentó
abrir un cursor que
ya se encontraba
abierto. Recuerde que
CURSOR_ALREADY_
un cursor de ciclo -6511
OPEN
FOR automáticamente
lo abre y ello no se
debe especificar con
la sentencia OPEN
Excepciones definidas por
el sistema
El programa intentó
almacenar valores
duplicados en una
columna que se
DUP_VAL_ON_INDE
mantiene con -1
X
restricción de
integridad de un
índice único (unique
index)
El programa intentó
efectuar una
INVALID_CURSOR -1001
operación no válida
sobre un cursor
En una sentencia SQL,
la conversión de una
cadena de caracteres
INVALID_NUMBER hacia un número falla -1722
cuando esa cadena no
representa un número
válido
Excepciones definidas por
el sistema
El programa intentó
conectarse a Oracle
LOGIN_DENIED con un nombre de -1017
usuario o password
inválido
Una sentencia SELECT
INTO no devolvió
valores o el programa
NO_DATA_FOUND referenció un 100
elemento no
inicializado en una
tabla indexada
El programa efectuó
NOT_LOGGED_ON una llamada a Oracle -1012
sin estar conectado
PL/SQL tiene un
PROGRAM_ERROR -6501
problema interno
Excepciones definidas por
el sistema
Los elementos de una
ROWTYPE_MISMATC asignación (el valor a asignar
-6504
H y la variable que lo contendrá)
tienen tipos incompatibles.
El parámetro SELF (el primero
SELF_IS_NULL que es pasado a un método -30625
MEMBER) es nulo
La memoria se terminó o está
STORAGE_ERROR -6500
corrupta
La conversión de una cadena
SYS_INVALID_ROWI de caracteres hacia un tipo
-1410
D rowid falló porque la cadena
no representa un número
Se excedió el tiempo máximo
TIMEOUT_ON_RESO
de espera por un recurso en -51
URCE
Oracle
Una sentencia SELECT INTO
TOO_MANY_ROWS -1422
devuelve más de una fila
Excepciones definidas por
el sistema
Ocurrió un error aritmético,
de conversión o truncamiento.
Por ejemplo, sucede cuando se
VALUE_ERROR -6502
intenta calzar un valor muy
grande dentro de una variable
más pequeña
El programa intentó efectuar
ZERO_DIVIDE -1476
una división por cero
Excepciones definidas por
el sistema
Excepciones del sistema Estas son las excepciones predefinidas del sistema. Un ejemplo de
ellas es el NO_DATA_FOUND, que se dispara cuando un SELECT-INTO no obtiene registros,
veamos:
DECLARE
  v_empid emp.empid%TYPE;
BEGIN
  ...
  SELECT e.empid INTO v_empid  
  FROM emp e
  WHERE e.ename = 'CHARLIE';
EXCEPTION
  WHEN NO_DATA_FOUND THEN
   RAISE OT_FAILURE;
  WHEN TOO_MANY_ROWS THEN
   RAISE OT_FAILURE;
END;
En este caso cuando el SELECT no devuelve columnas o devuelve más de una se levanta una
excepción que a su vez es atrapada para ser reenviada a una excepción definida por el usuario.
Vea a continuación la lista de excepciones del sistema;

También podría gustarte