Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql возврат структуры таблицы по результату функции / 6 сообщений из 6, страница 1 из 1
21.01.2019, 02:09
    #39762183
mcmot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql возврат структуры таблицы по результату функции
Здравствуйте!

Написал функцию на plpgsql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION getcust()
 RETURNS TABLE (idd uuid, named varchar(200))
 AS
 $body$
 BEGIN
 RETURN query SELECT id, name from customer;
 END;
 $body$
 LANGUAGE plpgsql VOLATILE



Возвращает таблицу из двух колонок.
Возможно ли обойтись без returns table (где определенно заданные типы данных и кол-во колонок), а использовать RETURNS SETOF или еще что-то для возврата тех колонок и тех типов, которые будут выдаваться после RETURN query (динамическая таблица с разным кол-вом колонок и типами)?
Заранее огромное спасибо!
...
Рейтинг: 0 / 0
21.01.2019, 09:06
    #39762219
sereginseregin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql возврат структуры таблицы по результату функции
mcmot,

сделать функцию, которая бы возвращала динамическую структуру нельзя, но

1) можно вернуть таблицу с полем JSON - универсально, но затраты на преобразование в JSON
2) либо функцию, которая генерит текстовый SQL, который выполняется через PREPARE , затем EXECUTE
...
Рейтинг: 0 / 0
21.01.2019, 11:29
    #39762261
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql возврат структуры таблицы по результату функции
mcmotВозможно ли обойтись без returns table (где определенно заданные типы данных и кол-во колонок), а использовать RETURNS SETOF или еще что-то для возврата тех колонок и тех типов, которые будут выдаваться после RETURN query (динамическая таблица с разным кол-вом колонок и типами)?

Разумеется можно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION public.return_query(sql text)
 RETURNS SETOF record
 LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY EXECUTE sql;
END; $$


Только при вызове нужно обязательно указывать структуру таблицы:
Код: sql
1.
2.
3.
4.
5.
postgres=# select * from return_query('select 1, true') as mytab (id int, b boolean);
 id | b 
----+---
  1 | t
(1 row)


иначе будет ошибка:
Код: sql
1.
2.
3.
postgres=# select * from return_query('select 1, true');
ERROR:  a column definition list is required for functions returning "record"
LINE 1: select * from return_query('select 1, true');
...
Рейтинг: 0 / 0
21.01.2019, 12:01
    #39762281
sereginseregin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql возврат структуры таблицы по результату функции
Павел ЛузановРазумеется можно:
...
Только при вызове нужно обязательно указывать структуру таблицы:

Прикольно, этот способ оказался вычеркнут из моей ассоциативной памяти. Как то попробовал пару раз, решил что такие функции писать совсем нехорошо, видимо поэтому мои нейроны выдали, что такого способа не существует :-).
...
Рейтинг: 0 / 0
21.01.2019, 20:56
    #39762546
mcmot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql возврат структуры таблицы по результату функции
Спасибо всем! Очень помогли!
...
Рейтинг: 0 / 0
22.01.2019, 09:40
    #39762655
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql возврат структуры таблицы по результату функции
А еще в функции можно открывать курсор и возвращать refcursor.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql возврат структуры таблицы по результату функции / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]