Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

ORA-01403 1С:Предприятие и СУБД

Ошибка ORA-01403: no data found в PL/SQL Oracle — обработка исключений

Обновлено: 26.08.2026 · Официальная документация ↗
  • Ошибка 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;
💡 Практика специалистов: Не используйте пустые блоки `EXCEPTION WHEN NO_DATA_FOUND THEN NULL;` без логирования. Это маскирует логические ошибки в коде и сильно затрудняет отладку бизнес-логики.

Частые вопросы (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;.

Полезные материалы
Рекомендуем