Прежде всего, сама 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: если какая-либо часть вашего обработчика исключений не выдает ни RAISE, ни RAISE_APPLICATION_ERROR, тогда вы фактически подметаете исключение под ковром - пользователь будет думать, что процедура сработала.
Между прочим, DBMS_OUTPUT.PUT_LINE отлично подходит для тестирования и отладки в SQL Plus или IDE, но ему не место в реальном коде, поскольку пользователи и приложения, вызывающие процедуру, никогда не увидят вывод, который она выдает.