Fundamentals PL/SQL: Chapter 08 Handling Exceptions

21 comentarios para “Fundamentals PL/SQL: Chapter 08 Handling Exceptions”

  1. martincx Dice:

    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.

  2. pdjaramillo Dice:

    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

  3. D. Armando Dice:

    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

  4. Luis Feijoo Dice:

    Aqui dejo otro link donde encontraran mas excepciones

    http://www.plsql.biz/2007/01/manejo-de-excepciones-el-plsql.html

  5. Gabriela Puglla Dice:

    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.

  6. claucar Dice:

    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’);
    . . .

  7. majito Dice:

    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).

  8. Lorena Dice:

    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;

    /

  9. Nori Dice:

    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.

  10. claucar Dice:

    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.

  11. Juan Pablo Angamarca Dice:

    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.

  12. Marcela Gómez González Dice:

    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

  13. Yesy Dice:

    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.

  14. Juan Pablo Angamarca Dice:

    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.

  15. Yesy Dice:

    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;

  16. Luis Feijoo Dice:

    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.

  17. claucar Dice:

    Para verificar que un procedimieto se ha creado consultamos la tabla USER_PROCEDURE.

    SELECT *
    FROM USER_PROCEDURES;

  18. claucar Dice:

    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.

  19. youssef Dice:

    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’);


Escribe un comentario