Прежде всего, сама Oracle поднимет сообщение об ошибке, если любая ошибка происходит во время выполнения процедуры - например:
ORA-02291: integrity constraint (EMP.MGR_FK) violated - parent key not Found
Вы можете обрабатывать ошибки явно, написав обработчик исключений, но если вы этого не сделаете хорошо, вы, скорее всего, просто запутаете проблему. Например, вы могли бы просто добавить это (как раз перед концом вашей процедуры:
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error occured');
Но теперь ваш пользователь не будет знать, какие ошибки, в то время как прежде, чем они могли бы сделать вывод, что это было то, что указанный руководитель не сделал . существуют можно показать исходное сообщение об ошибке также, как это:..
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error occured: '||SQLERRM);
, если это добавляет любое значение Или вы можете просто показать общую ошибку, а затем записать значение SQLERRM в таблицу журнала
вы может также обрабатывать особые исключения: например,
PROCEDURE ... IS
e_invalid_fk EXCEPTION;
PRAGMA EXCEPTION_INIT(e_invalid_fk,-2291);
BEGIN
...
EXCEPTION
WHEN e_invalid_fk THEN
IF SQLERRM LIKE '%(EMP.MGR_FK)%' THEN
raise_application_error(-20001,'Invalid manager specified');
ELSE
RAISE;
END IF;
END;
Обратите внимание на ПОДЪЕМ: если какая-либо часть вашего обработчика исключений не выдает либо ПОВЫШЕНИЕ или raise_application_error то вы фактически подметает исключение под ковер - пользователь будет думать, что процедура работает.
Кстати, DBMS_OUTPUT.PUT_LINE отлично подходит для тестирования и отладки в SQL Plus или IDE, но в реальном коде нет места, поскольку пользователи и приложения, вызывающие эту процедуру, никогда не смогут увидеть вывод, который он производит ,
+1 - сделал все пункты, которые я собирался сделать, особенно непригодность DBMS_OUTPUT для обработки ошибок (исключение в нескольких особых случаях). – APC
+1, мне также нравится raise_application_error (xxx, msg, ** TRUE **), таким образом, стек ошибок сохраняется. Это полезно как для конечного пользователя, так и для поддержки. –
Я всегда забываю третий параметр! –