Ошибка ORA-01403: no data found в PL/SQL Oracle — обработка исключений
- Ошибка
ORA-01403: no data foundпри выполнении хранимых процедур, функций или анонимных блоков PL/SQL. - Конструкция
SELECT ... INTO ...не вернула ни одной строки из таблицы. - Попытка обращения к несуществующему элементу ассоциативного массива (PL/SQL Collection).
1. Перехват исключения через блок EXCEPTION
DECLARE
v_val VARCHAR2(100);
BEGIN
SELECT column_val INTO v_val
FROM my_table
WHERE id = 99999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_val := 'DEFAULT_VALUE'; -- Корректная обработка отсутствия записи
DBMS_OUTPUT.PUT_LINE('Record not found, applied default value.');
END;2. Использование агрегатных функций для предотвращения ошибки
Агрегатные функции (MAX, MIN, COUNT) гарантированно возвращают одну строку (NULL или 0) даже при пустой выборке:
DECLARE
v_val VARCHAR2(100);
BEGIN
-- Никогда не вызовет ORA-01403
SELECT MAX(column_val) INTO v_val
FROM my_table
WHERE id = 99999;
END;3. Безопасная проверка элементов коллекций
IF my_collection.EXISTS(i) THEN
v_data := my_collection(i);
END IF; Частые вопросы (FAQ)
Почему обычный SQL запрос SELECT не вызывает ORA-01403 в sqlplus?
В обычном SQL пустой результат — это штатная ситуация (возвращается 0 строк). Исключение ORA-01403 генерируется только движком PL/SQL, когда конструкция SELECT INTO ожидает обязательное присвоение значения переменной.
Генерируют ли команды UPDATE и DELETE ошибку ORA-01403 при отсутствии строк?
Нет. Если UPDATE или DELETE не нашли строк для модификации, ошибка не возникает, а переменная SQL%NOTFOUND принимает значение TRUE (SQL%ROWCOUNT = 0).
В чем отличие ORA-01403 от ORA-01422?
ORA-01403 означает, что запрос вернул 0 строк (меньше ожидаемого). ORA-01422 (TOO_MANY_ROWS) означает, что SELECT INTO вернул 2 и более строк (больше ожидаемого).
Как вернуть значение по умолчанию без блока EXCEPTION в SQL?
Используйте соединение с таблицей DUAL или подзапрос с NVL: SELECT NVL((SELECT val FROM t WHERE id=1), 'default') FROM dual;.