Ошибка PostgreSQL 42P02: undefined_parameter — биндинг переменных
- Ошибка выполнения запроса
ERROR: there is no parameter $.(SQLSTATE 42P02) - Сбои при выполнении подготовленных выражений (Prepared Statements), когда переданных позиционных параметров меньше, чем указано в теле запроса.
- Ошибки прямого выполнения SQL через внешние компоненты или REST-коннекторы к базе 1С.
1. Анализ текста запроса и биндинга параметров
Проверьте соответствие плейсхолдеров ($1, $2, ...) и фактически переданных значений в логе PostgreSQL:
-- Ошибочный запрос (указан $2, но передан только один параметр):
PREPARE get_doc(int) AS SELECT * FROM _document123 WHERE _id = $1 AND _posted = $2;
-- Исправленный запрос:
PREPARE get_doc(int, bool) AS SELECT * FROM _document123 WHERE _id = $1 AND _posted = $2;
EXECUTE get_doc(100500, true);2. Проверка генерации запросов в коде интеграции
Если используется связка с Python/NodeJS/C#, убедитесь, что библиотека формирует строгую последовательность без пропусков индексов (нельзя использовать $1 и $3 без $2):
-- Неверно:
SELECT * FROM users WHERE id = $1 AND role = $3;
-- Корректно:
SELECT * FROM users WHERE id = $1 AND role = $2;3. Очистка кэша подготовленных выражений
DEALLOCATE ALL; Частые вопросы (FAQ)
Почему возникает ошибка 42P02 при динамическом формировании SQL в 1С?
Ошибка возникает, если при генерации текста запроса для внешнего источника данных был сформирован строковый литерал со знаком $ (например, в значении поля), который парсер PostgreSQL ошибочно интерпретировал как позиционный параметр.
Как экранировать символ доллара в запросах PostgreSQL?
Используйте стандартные экранированные строки E'...' или доллар-квотинг с уникальным тегом: $tag$текст с $1 внутри$tag$.
Каково максимальное количество параметров в одном запросе PostgreSQL?
В протоколе PostgreSQL количество параметров в Bind-сообщении ограничено типом int16 и составляет максимум 65535 параметров.
Что делать при ошибке prepared statement "..." does not exist?
Это ошибка 26000. В отличие от 42P02, она указывает на то, что само подготовленное выражение не найдено или сессия пулера соединений сменилась.