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