Ошибка ORA-06512: at line — трассировка стека вызовов в Oracle PL/SQL
- В консоли отображается сообщение вида
ORA-06512: at "SCHEMA.PACKAGE_NAME", line 145. - Ошибка ORA-06512 всегда идет в связке с корневой ошибкой (например,
ORA-01403: no data found,ORA-00001илиORA-01476: divisor is equal to zero). - Сбой в выполнении триггеров или хранимых функций 1С/Oracle.
1. Анализ полного стека ошибок
Обратите внимание на самую первую строку в стеке исключений — именно она указывает на реальную причину сбоя, а последующие ORA-06512 лишь показывают путь распространения ошибки по стеку вызовов.
2. Просмотр исходного кода на указанной строке
SELECT text
FROM all_source
WHERE owner = 'SCHEMA_NAME'
AND name = 'PACKAGE_NAME'
AND type = 'PACKAGE BODY'
AND line = 145;3. Использование корректной обработки исключений в PL/SQL
Используйте FORMAT_ERROR_BACKTRACE в блоках EXCEPTION, чтобы не терять исходную строку при перехвате:
BEGIN
-- Бизнес-логика
NULL;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('Backtrace: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
RAISE;
END; Частые вопросы (FAQ)
Является ли ORA-06512 самостоятельной ошибкой?
Нет, ORA-06512 — это информационная запись стека вызовов (Stack Trace), которая лишь указывает номер строки и имя объекта, где произошло необработанное исключение.
Почему номер строки в ORA-06512 иногда не совпадает с кодом?
Это происходит, если перед просмотром кода пакет был изменен без компиляции, либо если ошибка возникла внутри анонимного динамического SQL-блока (EXECUTE IMMEDIATE).
Как узнать параметры запроса, вызвавшего ошибку?
Включите расширенное логирование через триггер AFTER SERVERERROR или используйте трассировку событий через DBMS_MONITOR / SQL Trace.
Как защитить код от падения по ORA-01403 (No data found)?
Всегда оборачивайте одиночные операторы SELECT INTO в блок BEGIN ... EXCEPTION WHEN NO_DATA_FOUND THEN ... END.