Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Динамический запрос с возвратом результирующего набора  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 438
Доброго времени суток. Мне нужен аналог sp_executesql из MS SQL.
А сделать мне нужно что-то вроде:
EXECUTE 'SELECT * FROM  tbTest WHERE ID > $1;'
   USING minID;

Чтобы оно банально вернуло резалтсет (делается это внутри хранимой процедуры)
7 фев 20, 19:14    [22075769]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос с возвратом результирующего набора  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4071
Шамиль Фаридович
Доброго времени суток. Мне нужен аналог sp_executesql из MS SQL.
А сделать мне нужно что-то вроде:
EXECUTE 'SELECT * FROM  tbTest WHERE ID > $1;'
   USING minID;

Чтобы оно банально вернуло резалтсет (делается это внутри хранимой процедуры)


А что именно у вас не получается???
https://www.postgresql.org/docs/12/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
в документации все разобрано.
Ну или если вам больше 1 строки надо обработать то
https://www.postgresql.org/docs/12/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING
(в конце там как с execute при loop работать описано).

Все есть в документации. ))
7 фев 20, 20:24    [22075794]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос с возвратом результирующего набора  [new]
Swa111
Member

Откуда:
Сообщений: 123
Шамиль Фаридович,

Еще можно через 40.7.2.2. OPEN FOR EXECUTE. А курсор уже можно передать куда угодно.
9 фев 20, 19:49    [22076349]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос с возвратом результирующего набора  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 438
После ознакомления с вашими ссылками я решил сделать немного по другому:
моя функция в цикле соберет во временную таблицу необходимые данные, а потом просто вернет ее.
Но почему не работает вот такая простейшая конструкция?
execute 'INSERT INTO tbtest (id,decim) values(6, 0.16);';


Сообщение
ОШИБКА:  ошибка синтаксиса (примерное положение: "'INSERT INTO tbtest (id,decim) values(6, 0.16);'")
SQL state: 42601
Character: 9

мне ни о чем не говорит, ведь эта же конструкция без EXECUTE спокойно отрабатывает.
11 фев 20, 02:33    [22077309]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос с возвратом результирующего набора  [new]
entrypoint
Member

Откуда:
Сообщений: 227
Шамиль Фаридович,

EXECUTE - оператор языка PL/pgSQL, следовательно результат выполнения мы можем увидеть используя его, либо в функции, либо в и анонимном блоке

DO 
$$
BEGIN 
	EXECUTE 'INSERT INTO tbtest (id,decim) VALUES(6,  .16)';
END;
$$


Сообщение было отредактировано: 11 фев 20, 11:01
11 фев 20, 11:02    [22077425]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос с возвратом результирующего набора  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4071
Шамиль Фаридович
После ознакомления с вашими ссылками я решил сделать немного по другому:
моя функция в цикле соберет во временную таблицу необходимые данные, а потом просто вернет ее.


На всякий случай - создание и удаление временных таблиц в postgresql - штука очень дорогая по ресурсам.
Поэтому в простых и часто вызываемых (часто - раз в секунду это уже часто в этом случае) случаях их категорически не рекомендуется использовать.

Временные таблицы (в версии postgresq) - больше для сложной аналитики и ETL задач сделаны.
11 фев 20, 12:36    [22077520]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос с возвратом результирующего набора  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 438
entrypoint, Maxim Boguk
Спасибо!
12 фев 20, 13:55    [22078339]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить