PL/SQL proporciona un gran número de excepciones predefinidas que permiten controlar las condiciones de error más habituales. Las excepciones predefinidas no necesitan ser declaradas y son las siguientes:
DUP_VAL_ON_INDEX – Se produce cuando se intenta almacenar un valor ya existente en una columna que tiene restricción de índice único.
TIMEOUT_ON_RESOURCE – Se excedió el tiempo máximo de espera por un recurso en Oracle.
NOT_LOGGED_ON – El programa efectuó una llamada a Oracle sin estar conectado.
LOGIN_DENIED – El login o la contraseña utilizados para entrar en Oracle son inválidos.
NO_DATA_FOUND – Una sentencia SELECT INTO no devolvió ningún registro.
TOO_MANY_ROWS – Una sentencia SELECT INTO devolvió más de un registro.
ZERO_DIVIDE – Se ha ejecutado una división donde el divisor valía cero.
STORAGE_ERROR – Si no se dispone de más memoria o la memoria esta dañada.
PROGRAM_ERROR – Ocurrió un problema interno al ejecutar el código PL/SQL.
INVALID_NUMBER – Cuando falla la conversión de una cadena de caracteres hacia un número porque la cadena no representa un número válido.
VALUE_ERROR – Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo, esto sucede cuando se intenta dar un valor muy grande a una variable que no soporta dicho tamaño.
ROWTYPE_MISMATCH – Los elementos de una asignación (el valor a asignar y la variable que lo contendrá) son de tipos incompatibles. También se presenta este error cuando un parámetro pasado a un subprograma no es del tipo esperado.
SYS_INVALID_ROWID – Falla la conversión de una cadena de caracteres hacia un tipo rowid porque la cadena no representa un número.
INVALID_CURSOR – Se efectuó una operación no válida sobre un cursor. Suele ocurrir cuando un cursor no está abierto y se ejecuta una sentencia para cerrar dicho cursor.
CURSOR_ALREADY_OPEN – Cuando se intenta abrir un cursor que ya estaba abierto. Hay que recordar que un cursor de tipo FOR se abre automáticamente por lo que no se debe ejecutar la sentencia OPEN.
ACCESS_INTO_NULL – Se intentó asignar un valor a los atributos de un objeto no inicializado.
COLLECTION_IS_NULL – Se intentó asignar un valor a una tabla anidada aún no inicializada.
SELF_IS_NULL – El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo.
OTHERS – Cualquier otro tipo de error que pueda producirse. Cuando se utiliza la excepción OTHERS, cualquier excepción que no se haya tratado anteriormente se procesará según la secuencia de instrucciones incluida dentro de la sección OTHERS. OTHERS debe ser la última excepción tratada dentro de la sección dedicada al tratamiento de excepciones.
ACCESS_INTO_NULL El programa intentó asignar valores a los atributos de un objeto no inicializado -6530
COLLECTION_IS_NULL El programa intentó asignar valores a una tabla anidada aún no inicializada -6531
CURSOR_ALREADY_OPEN El programa intentó abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automáticamente lo abre y ello no se debe especificar con la sentencia OPEN -6511
DUP_VAL_ON_INDEX El programa intentó almacenar valores duplicados en una columna que se mantiene con restricción de integridad de un índice único (unique index) -1
INVALID_CURSOR El programa intentó efectuar una operación no válida sobre un cursor -1001
INVALID_NUMBER En una sentencia SQL, la conversión de una cadena de caracteres hacia un número falla cuando esa cadena no representa un número válido -1722
LOGIN_DENIED El programa intentó conectarse a Oracle con un nombre de usuario o password inválido -1017
NO_DATA_FOUND Una sentencia SELECT INTO no devolvió valores o el programa referenció un elemento no inicializado en una tabla indexada 100
NOT_LOGGED_ON El programa efectuó una llamada a Oracle sin estar conectado -1012
PROGRAM_ERROR PL/SQL tiene un problema interno -6501
ROWTYPE_MISMATCH Los elementos de una asignación (el valor a asignar y la variable que lo contendrá) tienen tipos incompatibles. También se presenta este error cuando un parámetro pasado a un subprograma no es del tipo esperado -6504
SELF_IS_NULL El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo -30625
STORAGE_ERROR La memoria se terminó o está corrupta -6500
SUBSCRIPT_BEYOND_COUNT El programa está tratando de referenciar un elemento de un arreglo indexado que se encuentra en una posición más grande que el número real de elementos de la colección -6533
SUBSCRIPT_OUTSIDE_LIMIT El programa está referenciando un elemento de un arreglo utilizando un número fuera del rango permitido (por ejemplo, el elemento “-1”) -6532
SYS_INVALID_ROWID La conversión de una cadena de caracteres hacia un tipo rowid falló porque la cadena no representa un número -1410
TIMEOUT_ON_RESOURCE Se excedió el tiempo máximo de espera por un recurso en Oracle -51
TOO_MANY_ROWS Una sentencia SELECT INTO devuelve más de una fila -1422
VALUE_ERROR Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable más pequeña -6502
ZERO_DIVIDE El programa intentó efectuar una división por cero -1476
podemos verificar por medio de este link l tipo de errores que se da al manipular oracle http://www.ora-code.com/ nos da una infinidad de tipos de errores.
RAISE_APPLICATION_ERROR(500,’Se ha producido un error’);
Cuando en un subprograma se realiza una llamada a este procedimiento, se lanza la excepción y se deshacen los cambios que hubiera podido realizar dicho subprograma.
. . .
IF salario IS NULL THEN
RAISE_APPLICATION_ERROR(1000,’El salario no puede ser nulo’);
. . .
Compañeros a continuación pongo a disposición un ejemplo donde se manejan excepciones predefinidas como: NO_DATA_FOUND, TOO_MANY_ROWS y OTHERS; que ya fue mensionada anteriormente cual es su funcionalidad.
DECLARE
vprecio inventario.precio%TYPE;
BEGIN
[Otras sentencias]
BEGIN
SELECT precio FROM inventario
WHERE cantidad = 100
INTO vprecio;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(“No hay ningún artículo.”);
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE(“Hay más de un artículo.”);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(“Error, abortando ejecución.”);
RAISE;
END;
[Otras sentencias]
END;
En este ejemplo si la sentencia SELECT INTO fallase por no devolver ningún registro o por devolver más de uno, se mandaría un mensaje de error a la pantalla pero la ejecución del programa continuaría; por contra, para cualquier otro error, aunque también se mandaría un mensaje de error a la pantalla, la ejecución del programa se abortaría (comando RAISE).
He encontrado un ejemplo con la Exception ZERO_DIVIDE……El programa intenta efectuar una división por cero, lo comparto para que me ayuden a entender mejor su funcionalidad gracias
DECLARE
v_num1 NUMBER := 5;
v_num2 NUMBER := 0;
v_result NUMBER;
BEGIN
v_result := v_num1/v_num2;
DBMS_OUTPUT.PUT_LINE(‘The quotient is ‘||TO_CHAR(v_result));
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE(‘You cannot divide by zero’);
END;
Aqui expongo algunas excepciones predefinidas en oracle especialmente para cursores que es el tema que estamos revisando.
CURSOR_ALREADY_OPEN El programa intentó abrir un cursor que ya se encontraba abierto. Debemos recordar que un cursor de ciclo FOR automáticamente lo abre y ello no se debe especificar con la sentencia OPEN .
INVALID_CURSOR El programa intentó efectuar una operación no válida sobre un cursor.
PROGRAM_ERROR – Ocurrió un problema interno al ejecutar el código PL/SQL.
STORAGE_ERROR – Si no se dispone de más memoria o la memoria esta dañada.
A continuación se presenta un ejemplo de las excepciones definidas por el usuario utilizando RAISE, también se puede apreciar en la salida las palabras old y new mismas que aparecen porque se está asignando valores a variables globales.
DEFINE p_department_desc = ‘Information Technology’
DEFINE p_department_number = 300
DECLARE
e_invalid_department EXCEPTION;
BEGIN
UPDATE departments
SET department_name = ‘&p_department_desc’
WHERE department_id = &p_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN
DBMS_OUTPUT.PUT_LINE(‘No such department id.’);
END;
/
SALIDA
old 5: SET department_name = ‘&p_department_desc’
new 5: SET department_name = ‘Information Technology’
old 6: WHERE department_id = &p_department_number;
new 6: WHERE department_id = 300;
PL/SQL procedure successfully completed.
Este código define una rutina para eliminar un registro de departamentos. Si el departamento tiene empleados asociados, al intentar hacer la operación se violará una constraint de integridad. Para capturar la excepción que se levantará, se declara previamente un tipo de excepción e_emps_remaining. Se asocia este tipo de excepción al código de error que se produce al violar este tipo de constraints (-2292, ORA-02292: integrity constraint violated – child record found), de tal forma que se captura en la sección EXCEPTION.
DEFINE p_deptno = 10
DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(e_emps_remaining, -2299);
BEGIN
DELETE FROM departments
WHERE department_id = &p_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE('No se puede quitar el departamento ' || TO_CHAR(&p_deptno) || '. Existen empleados asociados a él.');
END;
A continuación comparto un ejercicio que actualiza un fila de la tabla LOCATIONS. Utilizo la excepción SQL%NOTFOUND, en el caso de no encontrar la location 1500 presenta: ”No se encuentra location” , caso contrario actualiza la tabla
DEFINE p_location_desc = ‘ Marcela St. ‘
DEFINE p_location_number= 1500
DECLARE
e_invalid_location EXCEPTION;
BEGIN
UPDATE locations
SET street_address = ‘&p_location_desc’
WHERE location_id = &p_location_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_location;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_location THEN
DBMS_OUTPUT.PUT_LINE (‘No se encuentra location.. ‘);
END;
La salida es :
antiguo 5: SET street_address = ‘&p_location_desc’
nuevo 5: SET street_address = ‘ Marcela St. ‘
antiguo 6: WHERE location_id = &p_location_number;
nuevo 6: WHERE location_id = 1500;
Procedimiento PL/SQL terminado correctamente.
La fila actualizada es la siguiente
LOCATION_ID – STREET_ADDRESS- POSTAL_CODE – STATE_PROVINCE- CO
1500 Marcela St. 99236 San Francisco California US
Aqui les presento un ejemplo de excepciones usando la excepción raise…
DEFINE p_department_desc = ‘Information technology’
DEFINE p_detartment_number = 300
DECLARE
e_invalid_department EXCEPTION;
begin
UPDATE departments
SET department_name = ‘&p_department_desc’
WHERE department_id = &d_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN
DBMS_OUTPUT.PUT_LINE(‘No such department id.’);
end;
RESULTADO:
old 5: SET department_name = ‘&p_department_desc’
new 5: SET department_name = ‘Information technology’
old 6: WHERE department_id = &d_department_number;
new 6: WHERE department_id = 400;
No such department id.
PL/SQL procedure successfully completed.
Este código define una rutina para eliminar un registro de departamentos. Si el departamento tiene empleados asociados, al intentar hacer la operación se violará una constraint de integridad. Para capturar la excepción que se levantará, se declara previamente un tipo de excepción e_emps_remaining. Se asocia este tipo de excepción al código de error que se produce al violar este tipo de constraints (-2292, ORA-02292: integrity constraint violated – child record found), de tal forma que se captura en la sección EXCEPTION.
DEFINE p_deptno = 10
DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(e_emps_remaining, -2292);
BEGIN
DELETE FROM departments
WHERE department_id = &p_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE('No se puede quitar el departamento ' || TO_CHAR(&p_deptno) || '. Existen empleados asociados a él.');
END;
Aqui presento un ejemplo de la creación de un procedimiento usando un parámetro IN que crea el procedimiento RAISE_SALARY.
create or replace procedure raise_salary
(p_id IN employees.employee_id%TYPE)
IS
BEGIN
UPDATE employees
SET salary =salary*1.10
WHERE employee_id=p_id;
END raise_salary;
CREATE OR REPLACE PROCEDURE raise_salary
(p_id in employees.employees_id%type)
IS
BEGIN
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = p_id;
END raise_salary;
se creo un procedimiento per con un warning:
Warning: Procedure created with compilation errors.
Luis tu procedimiento no se está ejecutando correctamente porque tiene un error en l aparte de (p_id in employees.employees_id%type) ya que es (p_id in employees.employee_id%type) es decir el nombre de la columna employee_id.
hola, tengo un problemita, esque estoy haciendo un proyecto en j2ee con struts, y cuando estoy borrando por ejemplpo un registro de un formulario ( equivale borrar una tupla de una tabla) si ese registro es clave externa de otra tabla , sale el tipico mensaje de error ORA-02292, yo quiero que cuando oracle detecta ese error cambia el mensaje a un mensaje personalizado.
habia pensado en un trigger after delete que tenga en su cuerpo una cosa mas o menos asi:
begin
EXCEPTION
WHEN OTHERS THEN
— Consider logging the error and then re-raise
raise_application_error (02292, ‘campo hijo encontrado’);
Mayo 13, 2008 a las 8:33 pm
PL/SQL proporciona un gran número de excepciones predefinidas que permiten controlar las condiciones de error más habituales. Las excepciones predefinidas no necesitan ser declaradas y son las siguientes:
DUP_VAL_ON_INDEX – Se produce cuando se intenta almacenar un valor ya existente en una columna que tiene restricción de índice único.
TIMEOUT_ON_RESOURCE – Se excedió el tiempo máximo de espera por un recurso en Oracle.
NOT_LOGGED_ON – El programa efectuó una llamada a Oracle sin estar conectado.
LOGIN_DENIED – El login o la contraseña utilizados para entrar en Oracle son inválidos.
NO_DATA_FOUND – Una sentencia SELECT INTO no devolvió ningún registro.
TOO_MANY_ROWS – Una sentencia SELECT INTO devolvió más de un registro.
ZERO_DIVIDE – Se ha ejecutado una división donde el divisor valía cero.
STORAGE_ERROR – Si no se dispone de más memoria o la memoria esta dañada.
PROGRAM_ERROR – Ocurrió un problema interno al ejecutar el código PL/SQL.
INVALID_NUMBER – Cuando falla la conversión de una cadena de caracteres hacia un número porque la cadena no representa un número válido.
VALUE_ERROR – Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo, esto sucede cuando se intenta dar un valor muy grande a una variable que no soporta dicho tamaño.
ROWTYPE_MISMATCH – Los elementos de una asignación (el valor a asignar y la variable que lo contendrá) son de tipos incompatibles. También se presenta este error cuando un parámetro pasado a un subprograma no es del tipo esperado.
SYS_INVALID_ROWID – Falla la conversión de una cadena de caracteres hacia un tipo rowid porque la cadena no representa un número.
INVALID_CURSOR – Se efectuó una operación no válida sobre un cursor. Suele ocurrir cuando un cursor no está abierto y se ejecuta una sentencia para cerrar dicho cursor.
CURSOR_ALREADY_OPEN – Cuando se intenta abrir un cursor que ya estaba abierto. Hay que recordar que un cursor de tipo FOR se abre automáticamente por lo que no se debe ejecutar la sentencia OPEN.
ACCESS_INTO_NULL – Se intentó asignar un valor a los atributos de un objeto no inicializado.
COLLECTION_IS_NULL – Se intentó asignar un valor a una tabla anidada aún no inicializada.
SELF_IS_NULL – El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo.
OTHERS – Cualquier otro tipo de error que pueda producirse. Cuando se utiliza la excepción OTHERS, cualquier excepción que no se haya tratado anteriormente se procesará según la secuencia de instrucciones incluida dentro de la sección OTHERS. OTHERS debe ser la última excepción tratada dentro de la sección dedicada al tratamiento de excepciones.
Mayo 13, 2008 a las 8:34 pm
Excepciones predefinidas en oracle
ACCESS_INTO_NULL El programa intentó asignar valores a los atributos de un objeto no inicializado -6530
COLLECTION_IS_NULL El programa intentó asignar valores a una tabla anidada aún no inicializada -6531
CURSOR_ALREADY_OPEN El programa intentó abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automáticamente lo abre y ello no se debe especificar con la sentencia OPEN -6511
DUP_VAL_ON_INDEX El programa intentó almacenar valores duplicados en una columna que se mantiene con restricción de integridad de un índice único (unique index) -1
INVALID_CURSOR El programa intentó efectuar una operación no válida sobre un cursor -1001
INVALID_NUMBER En una sentencia SQL, la conversión de una cadena de caracteres hacia un número falla cuando esa cadena no representa un número válido -1722
LOGIN_DENIED El programa intentó conectarse a Oracle con un nombre de usuario o password inválido -1017
NO_DATA_FOUND Una sentencia SELECT INTO no devolvió valores o el programa referenció un elemento no inicializado en una tabla indexada 100
NOT_LOGGED_ON El programa efectuó una llamada a Oracle sin estar conectado -1012
PROGRAM_ERROR PL/SQL tiene un problema interno -6501
ROWTYPE_MISMATCH Los elementos de una asignación (el valor a asignar y la variable que lo contendrá) tienen tipos incompatibles. También se presenta este error cuando un parámetro pasado a un subprograma no es del tipo esperado -6504
SELF_IS_NULL El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo -30625
STORAGE_ERROR La memoria se terminó o está corrupta -6500
SUBSCRIPT_BEYOND_COUNT El programa está tratando de referenciar un elemento de un arreglo indexado que se encuentra en una posición más grande que el número real de elementos de la colección -6533
SUBSCRIPT_OUTSIDE_LIMIT El programa está referenciando un elemento de un arreglo utilizando un número fuera del rango permitido (por ejemplo, el elemento “-1”) -6532
SYS_INVALID_ROWID La conversión de una cadena de caracteres hacia un tipo rowid falló porque la cadena no representa un número -1410
TIMEOUT_ON_RESOURCE Se excedió el tiempo máximo de espera por un recurso en Oracle -51
TOO_MANY_ROWS Una sentencia SELECT INTO devuelve más de una fila -1422
VALUE_ERROR Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable más pequeña -6502
ZERO_DIVIDE El programa intentó efectuar una división por cero -1476
Mayo 13, 2008 a las 8:34 pm
Pueden ver más sobre este tema en http://www.plsql.biz/2007/01/manejo-de-excepciones-el-plsql.html
Mayo 13, 2008 a las 8:42 pm
Son varias las que hay predefinidas, así que mejor les dejo el link en que encontre las excepciones, además tiene más información que les puede resultar muy útil.
http://www.devjoker.com/asp/indice_contenido.aspx?co_grupo=CSQL&as_categoria=2
Mayo 13, 2008 a las 8:46 pm
Aqui dejo otro link donde encontraran mas excepciones
http://www.plsql.biz/2007/01/manejo-de-excepciones-el-plsql.html
Mayo 13, 2008 a las 8:48 pm
Aqui hay más de lo mismo
http://www.plsql.biz/2007/01/manejo-de-excepciones-el-plsql.html
Mayo 13, 2008 a las 8:51 pm
podemos verificar por medio de este link l tipo de errores que se da al manipular oracle
http://www.ora-code.com/ nos da una infinidad de tipos de errores.
Mayo 13, 2008 a las 8:52 pm
A continuación se describe un procedimiento que sirve para lanzar errores, definir y personalizar un mensaje de error.
Su formato es:
RAISE_APPLICATION_ERROR(número_error,mensaje_error)
RAISE_APPLICATION_ERROR(500,’Se ha producido un error’);
Cuando en un subprograma se realiza una llamada a este procedimiento, se lanza la excepción y se deshacen los cambios que hubiera podido realizar dicho subprograma.
. . .
IF salario IS NULL THEN
RAISE_APPLICATION_ERROR(1000,’El salario no puede ser nulo’);
. . .
Mayo 13, 2008 a las 8:55 pm
Compañeros a continuación pongo a disposición un ejemplo donde se manejan excepciones predefinidas como: NO_DATA_FOUND, TOO_MANY_ROWS y OTHERS; que ya fue mensionada anteriormente cual es su funcionalidad.
DECLARE
vprecio inventario.precio%TYPE;
BEGIN
[Otras sentencias]
BEGIN
SELECT precio FROM inventario
WHERE cantidad = 100
INTO vprecio;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(“No hay ningún artículo.”);
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE(“Hay más de un artículo.”);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(“Error, abortando ejecución.”);
RAISE;
END;
[Otras sentencias]
END;
En este ejemplo si la sentencia SELECT INTO fallase por no devolver ningún registro o por devolver más de uno, se mandaría un mensaje de error a la pantalla pero la ejecución del programa continuaría; por contra, para cualquier otro error, aunque también se mandaría un mensaje de error a la pantalla, la ejecución del programa se abortaría (comando RAISE).
Mayo 13, 2008 a las 8:55 pm
He encontrado un ejemplo con la Exception ZERO_DIVIDE……El programa intenta efectuar una división por cero, lo comparto para que me ayuden a entender mejor su funcionalidad gracias
DECLARE
v_num1 NUMBER := 5;
v_num2 NUMBER := 0;
v_result NUMBER;
BEGIN
v_result := v_num1/v_num2;
DBMS_OUTPUT.PUT_LINE(‘The quotient is ‘||TO_CHAR(v_result));
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE(‘You cannot divide by zero’);
END;
/
Mayo 13, 2008 a las 9:00 pm
Aqui expongo algunas excepciones predefinidas en oracle especialmente para cursores que es el tema que estamos revisando.
CURSOR_ALREADY_OPEN El programa intentó abrir un cursor que ya se encontraba abierto. Debemos recordar que un cursor de ciclo FOR automáticamente lo abre y ello no se debe especificar con la sentencia OPEN .
INVALID_CURSOR El programa intentó efectuar una operación no válida sobre un cursor.
PROGRAM_ERROR – Ocurrió un problema interno al ejecutar el código PL/SQL.
STORAGE_ERROR – Si no se dispone de más memoria o la memoria esta dañada.
Mayo 15, 2008 a las 8:09 pm
A continuación se presenta un ejemplo de las excepciones definidas por el usuario utilizando RAISE, también se puede apreciar en la salida las palabras old y new mismas que aparecen porque se está asignando valores a variables globales.
DEFINE p_department_desc = ‘Information Technology’
DEFINE p_department_number = 300
DECLARE
e_invalid_department EXCEPTION;
BEGIN
UPDATE departments
SET department_name = ‘&p_department_desc’
WHERE department_id = &p_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN
DBMS_OUTPUT.PUT_LINE(‘No such department id.’);
END;
/
SALIDA
old 5: SET department_name = ‘&p_department_desc’
new 5: SET department_name = ‘Information Technology’
old 6: WHERE department_id = &p_department_number;
new 6: WHERE department_id = 300;
PL/SQL procedure successfully completed.
Mayo 15, 2008 a las 8:10 pm
Este código define una rutina para eliminar un registro de departamentos. Si el departamento tiene empleados asociados, al intentar hacer la operación se violará una constraint de integridad. Para capturar la excepción que se levantará, se declara previamente un tipo de excepción e_emps_remaining. Se asocia este tipo de excepción al código de error que se produce al violar este tipo de constraints (-2292, ORA-02292: integrity constraint violated – child record found), de tal forma que se captura en la sección EXCEPTION.
DEFINE p_deptno = 10
DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(e_emps_remaining, -2299);
BEGIN
DELETE FROM departments
WHERE department_id = &p_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE('No se puede quitar el departamento ' || TO_CHAR(&p_deptno) || '. Existen empleados asociados a él.');
END;
Hay información sobre algunos códigos de errores en esta página: http://download-uk.oracle.com/docs/cd/A97630_01/appdev.920/a96624/07_errs.htm.
Mayo 15, 2008 a las 8:13 pm
A continuación comparto un ejercicio que actualiza un fila de la tabla LOCATIONS. Utilizo la excepción SQL%NOTFOUND, en el caso de no encontrar la location 1500 presenta: ”No se encuentra location” , caso contrario actualiza la tabla
DEFINE p_location_desc = ‘ Marcela St. ‘
DEFINE p_location_number= 1500
DECLARE
e_invalid_location EXCEPTION;
BEGIN
UPDATE locations
SET street_address = ‘&p_location_desc’
WHERE location_id = &p_location_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_location;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_location THEN
DBMS_OUTPUT.PUT_LINE (‘No se encuentra location.. ‘);
END;
La salida es :
antiguo 5: SET street_address = ‘&p_location_desc’
nuevo 5: SET street_address = ‘ Marcela St. ‘
antiguo 6: WHERE location_id = &p_location_number;
nuevo 6: WHERE location_id = 1500;
Procedimiento PL/SQL terminado correctamente.
La fila actualizada es la siguiente
LOCATION_ID – STREET_ADDRESS- POSTAL_CODE – STATE_PROVINCE- CO
1500 Marcela St. 99236 San Francisco California US
Mayo 15, 2008 a las 8:16 pm
Aqui les presento un ejemplo de excepciones usando la excepción raise…
DEFINE p_department_desc = ‘Information technology’
DEFINE p_detartment_number = 300
DECLARE
e_invalid_department EXCEPTION;
begin
UPDATE departments
SET department_name = ‘&p_department_desc’
WHERE department_id = &d_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN
DBMS_OUTPUT.PUT_LINE(‘No such department id.’);
end;
RESULTADO:
old 5: SET department_name = ‘&p_department_desc’
new 5: SET department_name = ‘Information technology’
old 6: WHERE department_id = &d_department_number;
new 6: WHERE department_id = 400;
No such department id.
PL/SQL procedure successfully completed.
Mayo 15, 2008 a las 8:17 pm
Este código define una rutina para eliminar un registro de departamentos. Si el departamento tiene empleados asociados, al intentar hacer la operación se violará una constraint de integridad. Para capturar la excepción que se levantará, se declara previamente un tipo de excepción e_emps_remaining. Se asocia este tipo de excepción al código de error que se produce al violar este tipo de constraints (-2292, ORA-02292: integrity constraint violated – child record found), de tal forma que se captura en la sección EXCEPTION.
DEFINE p_deptno = 10
DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(e_emps_remaining, -2292);
BEGIN
DELETE FROM departments
WHERE department_id = &p_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE('No se puede quitar el departamento ' || TO_CHAR(&p_deptno) || '. Existen empleados asociados a él.');
END;
Hay información sobre algunos códigos de errores en esta página: http://download-uk.oracle.com/docs/cd/A97630_01/appdev.920/a96624/07_errs.htm.
Mayo 15, 2008 a las 8:47 pm
Aqui presento un ejemplo de la creación de un procedimiento usando un parámetro IN que crea el procedimiento RAISE_SALARY.
create or replace procedure raise_salary
(p_id IN employees.employee_id%TYPE)
IS
BEGIN
UPDATE employees
SET salary =salary*1.10
WHERE employee_id=p_id;
END raise_salary;
Mayo 15, 2008 a las 8:50 pm
Creando un procedimiento en PL/SQL
CREATE OR REPLACE PROCEDURE raise_salary
(p_id in employees.employees_id%type)
IS
BEGIN
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = p_id;
END raise_salary;
se creo un procedimiento per con un warning:
Warning: Procedure created with compilation errors.
Mayo 15, 2008 a las 8:52 pm
Para verificar que un procedimieto se ha creado consultamos la tabla USER_PROCEDURE.
SELECT *
FROM USER_PROCEDURES;
Mayo 15, 2008 a las 8:55 pm
Luis tu procedimiento no se está ejecutando correctamente porque tiene un error en l aparte de (p_id in employees.employees_id%type) ya que es (p_id in employees.employee_id%type) es decir el nombre de la columna employee_id.
Junio 20, 2008 a las 5:37 am
hola, tengo un problemita, esque estoy haciendo un proyecto en j2ee con struts, y cuando estoy borrando por ejemplpo un registro de un formulario ( equivale borrar una tupla de una tabla) si ese registro es clave externa de otra tabla , sale el tipico mensaje de error ORA-02292, yo quiero que cuando oracle detecta ese error cambia el mensaje a un mensaje personalizado.
habia pensado en un trigger after delete que tenga en su cuerpo una cosa mas o menos asi:
begin
EXCEPTION
WHEN OTHERS THEN
— Consider logging the error and then re-raise
raise_application_error (02292, ‘campo hijo encontrado’);