Обработка исключений ORACLE
Мне нужно обработать ошибка ORA-01400 (не удается вставить NULL в ("SCHEMA"."ИМЯ ТАБЛИЦЫ.""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