Ошибка PostgreSQL 2F000: sql_routine_exception — отладка процедур
- Ошибка выполнения функции
ERROR: sql_routine_exception (SQLSTATE 2F000). - Сбои внутри триггерных функций или хранимых процедур при попытке невалидной модификации данных.
- Отказ выполнения прямых процедур интеграции 1С с внешними системами через хранимый код PL/pgSQL.
1. Поиск упавшей функции и трассировка стека
Включите детальное логирование в postgresql.conf:
log_min_messages = info
log_min_error_statement = error
log_line_prefix = '%m [%p] %q%u@%d '
-- Примените настройки:
SELECT pg_reload_conf();2. Добавление блоков перехвата исключений (EXCEPTION) в PL/pgSQL
CREATE OR REPLACE FUNCTION update_order_status(p_order_id bigint, p_status int)
RETURNS void AS $$
BEGIN
-- Бизнес-логика функции
UPDATE orders SET status = p_status, updated_at = now() WHERE id = p_order_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Order % not found', p_order_id;
END IF;
EXCEPTION
WHEN sql_routine_exception THEN
RAISE WARNING 'Handled SQL routine exception for order %', p_order_id;
WHEN OTHERS THEN
RAISE EXCEPTION 'Internal error in update_order_status: % (SQLSTATE %)', SQLERRM, SQLSTATE;
END;
$$ LANGUAGE plpgsql;3. Проверка типов входных параметров и модификаторов изменчивости
Убедитесь, что функции с побочными эффектами (INSERT/UPDATE) не помечены как IMMUTABLE или STABLE:
ALTER FUNCTION update_order_status(bigint, int) VOLATILE;4. Отладка через модуль pldbgapi (PL/pgSQL Debugger)
CREATE EXTENSION pldbgapi; Частые вопросы (FAQ)
Что представляет собой класс ошибок 2F в стандарте SQL?
Класс 2F объединяет исключения, происходящие внутри исполняемых модулей ядра СУБД (SQL routines), включая запрет на модификацию данных внутри функций чтения (2F002, 2F003) и попытки несанкционированного вызова SQL.
Влияет ли блок EXCEPTION на производительность функции в PostgreSQL?
Да, секция EXCEPTION создает неявную точку сохранения (subtransaction / savepoint). При миллионах вызовов это создает значительную нагрузку на Transaction ID (xid/subxid).
Использует ли 1С:Предприятие хранимые процедуры на уровне PostgreSQL?
Штатно 1С выполняет большинство операций через параметризованные динамические SQL запросы. Хранимые процедуры обычно применяются в механизмах интеграции или внешних источниках данных.
Как получить полный стек вызовов при ошибке в функции?
Используйте конструкцию GET STACKED DIAGNOSTICS v_stack = PG_EXCEPTION_CONTEXT; внутри блока EXCEPTION.