EXCEPTION в Oracle SQL — как писать надёжный PL/SQL код

🟢EXCEPTION в Oracle SQL. Введение

Работа с базой данных всегда сопровождается рисками ошибок: отсутствием данных, нарушением ограничений, делением на ноль, и т.д.
Чтобы программа не «падала», Oracle предоставляет встроенный механизм обработки исключений, начинающийся с ключевого слова EXCEPTION.

С помощью него можно:

  • Перехватывать ошибки

  • Выводить сообщения

  • Выполнять альтернативные действия

  • Защищать данные от порчи


🔤 Написание

sql
BEGIN
-- основной код
EXCEPTION
WHEN тип_исключения THEN
-- действия при ошибке
END;

🧮 Пример:

sql
BEGIN
SELECT salary INTO v_sal FROM employees WHERE employee_id = 9999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Сотрудник не найден');
END;

🔄 Где часто используется

  • В процедурах и функциях

  • При работе с SELECT INTO, UPDATE, DELETE

  • В курсорах

  • В пакетной обработке

  • В пользовательских триггерах и пакетах API


🧪 10 Примеров использования EXCEPTION с пояснениями

1️⃣ Обработка ошибки NO_DATA_FOUND

sql
BEGIN
SELECT salary INTO v_sal FROM employees WHERE employee_id = 9999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Нет такого сотрудника');
END;

Избегаем ошибки, если запись не найдена.


2️⃣ Обработка TOO_MANY_ROWS

sql
BEGIN
SELECT department_id INTO v_dep FROM employees WHERE job_id = 'IT_PROG';
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Ожидалась одна строка, но вернулось несколько');
END;

Когда SELECT INTO возвращает больше одной строки.


3️⃣ Общий перехват всех ошибок (WHEN OTHERS)

sql
BEGIN
-- возможная ошибка
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Что-то пошло не так');
END;

Последний рубеж защиты.


4️⃣ Исключение с ROLLBACK

sql
BEGIN
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 'oops'; -- ошибка
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Ошибка, откат!');
END;

Гарантия целостности данных.


5️⃣ Пользовательское исключение

sql
DECLARE
e_negative_salary EXCEPTION;
BEGIN
IF v_salary < 0 THEN
RAISE e_negative_salary;
END IF;
EXCEPTION
WHEN e_negative_salary THEN
DBMS_OUTPUT.PUT_LINE('Зарплата не может быть отрицательной');
END;

Создание и вызов собственного исключения.


6️⃣ Вывод текста ошибки через SQLERRM

sql
BEGIN
-- потенциальная ошибка
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Ошибка: ' || SQLERRM);
END;

Полезно для отладки.


7️⃣ Подавление ошибки (ничего не делаем)

sql
BEGIN
DELETE FROM temp WHERE id = 999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;

Осознанное игнорирование.


8️⃣ Работа с делением на ноль

sql
BEGIN
v_result := 100 / v_divisor;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Деление на ноль!');
END;

Проверка арифметических ошибок.


9️⃣ Логгирование ошибок в таблицу

sql
EXCEPTION
WHEN OTHERS THEN
INSERT INTO error_log (error_msg, log_time)
VALUES (SQLERRM, SYSDATE);

Хорошая практика — сохранять ошибки.


🔟 EXCEPTION внутри процедуры

sql
CREATE OR REPLACE PROCEDURE safe_delete(p_id NUMBER) IS
BEGIN
DELETE FROM orders WHERE order_id = p_id;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Ошибка при удалении заказа');
END;

Безопасное выполнение DML.


🧩 Заключение

Оператор EXCEPTION позволяет писать устойчивый, безопасный и предсказуемый код. Он делает PL/SQL-наборы настоящими программами, а не просто скриптами. Правильная обработка ошибок — залог надёжной системы.

💡 Запомни:

  • Используется только в блоках BEGIN...END

  • Обрабатывает как стандартные, так и пользовательские ошибки

  • Используй WHEN OTHERS — как крайний случай

  • Сохраняй ошибки в лог для аудита


🔜 Следующая статья:

OPEN в Oracle SQL — как открыть курсор и подготовить его к пошаговому извлечению данных


Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии