PL / SQL – Excepciones

En este capítulo, discutiremos las excepciones en PL / SQL. Una excepción es una condición de error durante la ejecución del programa. PL / SQL ayuda a los programadores a detectar estas condiciones utilizando UNA EXCEPCIÓN está bloqueado en el programa y se toman las medidas adecuadas contra la condición de error. Hay dos tipos de excepciones:

  • Excepciones del sistema
  • Excepciones personalizadas

Sintaxis para manejar excepciones

La sintaxis general para manejar excepciones es la siguiente. Aquí puede enumerar todas las excepciones que pueda manejar. La excepción predeterminada se manejará con CUANDO OTRO QUE

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)> 
EXCEPTION 
   <exception handling goes here > 
   WHEN exception1 THEN  
      exception1-handling-statements  
   WHEN exception2  THEN  
      exception2-handling-statements  
   WHEN exception3 THEN  
      exception3-handling-statements 
   ........ 
   WHEN others THEN 
      exception3-handling-statements 
END;

Ejemplo

Escribamos un código para ilustrar el concepto. Usaremos la tabla CLIENTES que hemos creado y usado en los capítulos anteriores –

DECLARE 
   c_id customers.id%type := 8; 
   c_name customerS.Name%type; 
   c_addr customers.address%type; 
BEGIN 
   SELECT  name, address INTO  c_name, c_addr 
   FROM customers 
   WHERE id = c_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name); 
   DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 

EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!'); 
END; 
/

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

No such customer!  

PL/SQL procedure successfully completed. 

El programa anterior muestra el nombre y la dirección del cliente cuya identificación se especifica. Dado que no hay ningún cliente con ID 8 en nuestra base de datos, el programa lanza una excepción en tiempo de ejecución. DATOS NO ENCONTRADOSque se fija en Bloque de EXCEPCIÓN

Lanzar excepciones

El servidor de la base de datos genera automáticamente las excepciones cada vez que se produce un error interno de la base de datos, pero el programador puede lanzar excepciones explícitamente mediante el comando LEVANTAR… A continuación se muestra la sintaxis simple para lanzar una excepción:

DECLARE 
   exception_name EXCEPTION; 
BEGIN 
   IF condition THEN 
      RAISE exception_name; 
   END IF; 
EXCEPTION 
   WHEN exception_name THEN 
   statement; 
END; 

Puede utilizar la sintaxis anterior cuando se lanza una excepción estándar de Oracle o cualquier excepción personalizada. En la siguiente sección, le daremos un ejemplo de cómo crear una excepción personalizada. Del mismo modo, puede lanzar excepciones estándar de Oracle.

Excepciones personalizadas

PL / SQL le permite definir sus propias excepciones de acuerdo con las necesidades de su programa. La excepción definida por el usuario debe declararse y luego plantearse explícitamente utilizando la instrucción o procedimiento RAISE DBMS_STANDARD.RAISE_APPLICATION_ERROR

La sintaxis para declarar una excepción es:

DECLARE 
   my-exception EXCEPTION; 

Ejemplo

El siguiente ejemplo ilustra este concepto. Este programa solicita una identificación de cliente cuando el usuario ingresa una identificación no válida, excepción identificación invalida Ha aumentado.

DECLARE 
   c_id customers.id%type := &cc_id; 
   c_name customerS.Name%type; 
   c_addr customers.address%type;  
   -- user defined exception 
   ex_invalid_id  EXCEPTION; 
BEGIN 
   IF c_id <= 0 THEN 
      RAISE ex_invalid_id; 
   ELSE 
      SELECT  name, address INTO  c_name, c_addr 
      FROM customers 
      WHERE id = c_id;
      DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name);  
      DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 
   END IF; 

EXCEPTION 
   WHEN ex_invalid_id THEN 
      dbms_output.put_line('ID must be greater than zero!'); 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!');  
END; 
/

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

Enter value for cc_id: -6 (let's enter a value -6) 
old  2: c_id customers.id%type := &cc_id; 
new  2: c_id customers.id%type := -6; 
ID must be greater than zero! 
 
PL/SQL procedure successfully completed. 

Excepciones predefinidas

PL / SQL proporciona muchas excepciones predefinidas que se ejecutan cuando el programa viola una regla de la base de datos. Por ejemplo, la excepción NO_DATA_FOUND predefinida ocurre cuando la instrucción SELECT INTO no devuelve filas. La siguiente tabla enumera algunas de las importantes excepciones predefinidas.

Una excepción Error de Oracle SQLCODE Descripción
ACCESS_INTO_NULL 06530 -6530 Ocurre cuando a un objeto nulo se le asigna automáticamente un valor.
CASE_NOT_FOUND 06592 -6592 Ocurre cuando no se selecciona ninguna de las opciones de la cláusula WHEN de la sentencia CASE y no hay cláusula ELSE.
COLLECTION_IS_NULL 06531 -6531 Ocurre cuando un programa intenta aplicar métodos de colección distintos de EXISTS a una tabla o varray anidada no inicializada, o el programa intenta asignar valores a los elementos de una tabla o varray anidada no inicializada.
DUP_VAL_ON_INDEX 00001 -uno Ocurre cuando se intenta almacenar valores duplicados en una columna indexada de forma única.
INVALID_CURSOR 01001 -1001 Ocurre cuando se intenta realizar una operación de cursor no válida, como cerrar un cursor sin abrir.
NÚMERO EQUIVOCADO 01722 -1722 Ocurre cuando la conversión de una cadena de caracteres en un número falla porque la cadena no representa un número válido.
LOGIN_DENIED 01017 -1017 Ocurre cuando un programa intenta iniciar sesión en la base de datos con un nombre de usuario o contraseña no válidos.
DATOS NO ENCONTRADOS 01403 +100 Ocurre cuando la instrucción SELECT INTO no devuelve ninguna fila.
NOT_LOGGED_ON 01012 -1012 Ocurre cuando se realiza una llamada a la base de datos sin conectarse a la base de datos.
PROGRAM_ERROR 06501 -6501 Ocurre cuando hay un problema interno en PL / SQL.
ROWTYPE_MISMATCH 06504 -6504 Ocurre cuando el cursor selecciona un valor en una variable con un tipo de datos incompatible.
SELF_IS_NULL 30625 -30625 Ocurre cuando se llama a un método miembro, pero no se ha inicializado una instancia del tipo de objeto.
STORAGE_ERROR 06500 -6500 Ocurre cuando PL / SQL se ha quedado sin memoria o la memoria está dañada.
TOO_MANY_ROWS 01422 -1422 Ocurre cuando una instrucción SELECT INTO devuelve más de una fila.
VALUE_ERROR 06502 -6502 Ocurre cuando se produce un error aritmético, un error de conversión, un truncamiento o una limitación de tamaño.
ZERO_DIVIDE 01476 1476 Ocurre cuando se intenta dividir un número por cero.

🚫