2009-12-29 1 views
7

Мне нужно обработать ORA-01400 error (не может вставить NULL в («SCHEMA». »TABLE_NAME». «COLUMN_NAME»)), используя дескриптор исключения.Обработка Исключения ORACLE

ORACLE Предопределить несколько исключений, таких как (ACCESS_INTO_NULL, ZERO_DIVIDE и т. Д.), Но, по-видимому, не определяет исключение для ошибки ORA-01400, как мне обрабатывать этот конкретный код ошибки?

Мне нужно что-то подобное (принимаются другие предложения).

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

ответ

12

Предопределенные исключения PL/SQL являются специальный для Oracle. Вы действительно не можете возиться с ними. Если вы хотите иметь набор предопределенных исключений, вы не можете объявить их «глобально», как стандартные. Вместо этого создайте исключение исключений, который содержит все исключения и использует это в вашем приложении.

Пример:

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; 
/

Теперь используйте исключение, определенное в пакете

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; 
/

Источник: http://www.orafaq.com/wiki/Exception

+0

Большое спасибо. – RRUZ

2

вы можете определить свои собственные исключения, как переменные (они будут иметь один и тот же объем, что и другие переменные, так что вы можете определить исключение пакетов, и т.д. ...):

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

Винсент, я уже знал, что это, проблема этого решения заключается в том, что мне нужно для определения исключения для каждой конкретной таблицы. Я ищу способ служить для любой таблицы в моей схеме. – RRUZ

+0

создать триггер уровня схемы для обработки этого настраиваемого исключения – afftee

+0

@RRUZ: Я действительно не понимаю, вы можете использовать это исключение в ЛЮБОЙ таблице. Если вы определяете его в заголовке пакета, вы можете использовать его повсюду (то есть: он будет ** точно **, как предопределенное исключение oracle) –

3

Вы можете обрабатывать исключения по его коду, как это:

.... 
... 
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 выводит сообщение об ошибке SQL

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