Подтвердить что ты не робот

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

4b9b3361

Ответ 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)