Исключение - это переменная в PL/SQL, возбуждаемся во время выполнения блока. В случае возбуждения исключения, блок всегда прекращает работу, но можно задать обработчик исключения для выполнения заключительных дейсвтий.
Когда в СУБД при обработке PL/SQL инструкций возникают какие-то ошибки, СУБД выбрасывает исключение, прерывая основной поток обработки инструкций и переходя к обработчику ислючения. Причина ошибки определяется типом исключения, который внутренне представлен обычным числом.
В Oracle имеется набор предопределённых типов исключений, которые для удобства имеют имена. Например, исключение NO_DATA_FOUND (ORA-01403) возбуждается, когда оператор SELECT не возвращает ни одной строки.
Другие примеры: ZERO_DIVIDE (ORA_01476) – попытка деления на ноль, INVALID_NUMBER (ORA-01722) – попытка выполнения неверной операции на курсоре. Для каждого типа исключения нужен свой обработчик:
- EXCEPTION
- WHEN ТипИсключения
- THEN
- … ...
- END;
Для обработки остальных типов можно использовать обработчик OTHERS (WHEN OTHERS) - но пользоваться им нужно крайне аккуратно, обычно его вызывают в последнюю очередь, поскольку, если сделать проверку на него - он сработает, но вот исключения, описанные под ним - не сработают.
В обработчиках исключений тоже можно выбрасывать исключения, используя оператор RAISE, однако обработчики блока этого же уровня его не обработают (только внешние).