Обрабатывать ORACLE Исключения
Мне нужно обработать ошибку ORA-01400 (невозможно вставить NULL в ("SCHEMA"."TABLE_NAME"."COLUMN_NAME")), используя дескриптор исключения.
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;
4 ответа
Предопределенные исключения 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
Вы можете обработать исключение по его коду:
....
...
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;
Вы можете определить свои собственные исключения, такие как переменные (они будут иметь ту же область видимости, что и другие переменные, поэтому вы можете определить исключение пакета и т. д.):
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
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