2009-12-29 23 views
7

Necesito manejar el ORA-01400 error (no puedo insertar NULL en ("SCHEMA". "TABLE_NAME". "COLUMN_NAME")) utilizando un controlador de excepción.Manejar Excepciones de ORACLE

ORACLE Predefinir algunas excepciones como (ACCESS_INTO_NULL, ZERO_DIVIDE y así sucesivamente), pero aparentemente no define una excepción para el error ORA-01400, ¿cómo manejo este código de error en particular?

Necesito algo como esto (se aceptan otras sugerencias).

.... 
...  
INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName); 
COMMIT; 
    EXCEPTION 
    WHEN NULL_VALUES THEN /* i don't know this value , exist?*/ 
     Do_MyStuff(); 
    WHEN OTHERS THEN 
     raise_application_error(SQLCODE,MY_OWN_FORMAT_EXCEPTION(SQLCODE,SQLERRM),TRUE); 
    END; 

Respuesta

12

Las excepciones predefinidas PL/SQL son especial a Oracle. Realmente no puedes meterse con eso. Cuando quiere tener un conjunto de excepciones predefinidas, no puede declararlas "globalmente" como las estándar. En su lugar, cree un paquete de excepciones que tenga todas las declaraciones de excepción y utilícelo en su solicitud código de la aplicación.

Ejemplo:

CREATE OR REPLACE PACKAGE my_exceptions 
AS 
    insert_null_into_notnull EXCEPTION; 
    PRAGMA EXCEPTION_INIT(insert_null_into_notnull, -1400); 

    update_null_to_notnull EXCEPTION; 
    PRAGMA EXCEPTION_INIT(update_null_to_notnull, -1407); 
END my_exceptions; 
/

Ahora use la excepción definida en el paquete

CREATE OR REPLACE PROCEDURE use_an_exception AS 
BEGIN 
    -- application specific code ... 
    NULL; 
EXCEPTION 
    WHEN my_exceptions.insert_null_into_notnull THEN 
    -- application specific handling for ORA-01400: cannot insert NULL into (%s) 
    RAISE; 
END; 
/

Fuente: http://www.orafaq.com/wiki/Exception

+0

Muchas gracias. – RRUZ

2

puede definir sus propias excepciones, como las variables (que tendrán el mismo alcance que otras variables para que pueda definir excepción del embalaje, etc ...):

SQL> DECLARE 
    2  NULL_VALUES EXCEPTION; 
    3  PRAGMA EXCEPTION_INIT(NULL_VALUES, -1400); 
    4 BEGIN 
    5  INSERT INTO t VALUES (NULL); 
    6 EXCEPTION 
    7  WHEN null_values THEN 
    8  dbms_output.put_line('null value not authorized'); 
    9 END; 
10/

null value not authorized 

PL/SQL procedure successfully completed 
+0

Vicente, ya sabía esto, el problema de esta solución es que necesito para definir una excepción para cada tabla en particular. Estoy buscando una manera de servir para cualquier tabla en mi esquema. – RRUZ

+0

crear un desencadenante de nivel de esquema, para manejar esta excepción personalizada – afftee

+0

@RRUZ: Realmente no entiendo, puede usar esta excepción con CUALQUIER tabla. Si lo define en un encabezado de paquete, puede usarlo en todas partes (es decir, será ** exactamente ** como una excepción de oráculo predefinida) –

3

Puede manejar excepción por su código como este:

.... 
... 
INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName); 
COMMIT; 
    EXCEPTION 
    WHEN OTHERS THEN 
     IF SQLCODE = -1400 THEN 
     Do_MyStuff(); 
     ELSE 
     raise_application_error(SQLCODE,MY_OWN_FORMAT_EXCEPTION(SQLCODE,SQLERRM),TRUE); 
     END IF; 
    END; 
-1
INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName); 
COMMIT; 

     EXCEPTION 
     WHEN NULL_VALUES /* i don't know this value , exist?*/ 
      emesg := SQLERRM; 
      dbms_output.put_line(emesg); 
     WHEN OTHERS THEN 
      emesg := SQLERRM; 
      dbms_output.put_line(emesg); 
     END; 

SQLERRM muestra el mensaje de error sql

http://www.psoug.org/reference/exception_handling.html

Cuestiones relacionadas