динамический 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)