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:
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;
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…
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.
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;
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.
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. |
🚫