динамический sql-запрос в postgres
Я пытался использовать динамический SQL для запуска некоторых запросов в postgres.
пример:
EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)))
Я должен запросить таблицу, которая имеет форму result_%s_table, в которой мне нужно заменить правильное имя таблицы (идентификатор) из другой таблицы.
Я получаю ошибку ERROR: prepared statement "format" does not exist
ссылки: подстановка строк с результатом запроса postgresql
4 ответов
EXECUTE ... USING
работает только в PL / PgSQL - ie в пределах функций или DO
блоки написано на языке PL/PgSQL. Он не работает в обычном SQL;EXECUTE
в обычном SQL совершенно другое, для выполнения подготовленных операторов. Вы не можете использовать динамический SQL непосредственно на диалекте SQL PostgreSQL.
сравниваем:
см. 2-й последний par в мой предыдущий ответ.
в дополнение к не работает, кроме как в PL/PgSQL ваш оператор SQL неправильно, он не будет делать то, что вы ожидаете. Если (select id from ids where condition = some_condition)
возвращает сказать 42
, утверждение потерпит неудачу, если id
- целое число. Если это приведено к тексту, вы получите:
EXECUTE format('SELECT * from result_%s_table', quote_ident('42'));
EXECUTE format('SELECT * from result_%s_table', '"42"');
EXECUTE 'SELECT * from result_"42"_table';
это недопустимым. Вы действительно хотите result_42_table
или "result_42_table"
. Тебе придется написать что-то еще. например:
EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table'))
... если вы должны использовать quote_ident
.
попробуйте использовать
RETURN QUERY EXECUTE '<SQL Command>'
это вернет данные в виде таблицы. Вы должны использовать это в хранимой функции PostgreSQL.
Я уже создал полную демонстрацию пользовательского фильтра и пользовательской сортировки с использованием динамического запроса PostgreSQL. Пожалуйста, посетите этот url: http://www.dbrnd.com/2015/05/postgresql-dynamic-sql/
EXECUTE
будет работать только в среде pl/pqsql.
вместо выполнения попробуйте с помощью SELECT
SELECT format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition))
вывод будет динамическим запросом.
CREATE OR REPLACE FUNCTION public.exec(
text)
RETURNS SETOF RECORD
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
RETURN QUERY EXECUTE ;
END
$BODY$;
использование:
select * from exec('select now()') as t(dt timestamptz)