powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Приведение record к композитному типу
8 сообщений из 8, страница 1 из 1
Приведение record к композитному типу
    #38930724
pavel.panshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Столкнулся с необходимостью приведения результата функции, возвращающей set of records к композитному типу (определенному таблицей). Есть ли какой нибудь изящный метод сделать это.
Ниже простой пример того, что хочу сделать.(Версия 9.2)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table table1
as
(
select now() col1,now() col2
);
CREATE FUNCTION func1(OUT c1 timestamp with time zone, OUT c2 timestamp with time zone) RETURNS SETOF record AS
'select now(),now()'
LANGUAGE sql VOLATILE NOT LEAKPROOF;
ALTER FUNCTION func1()
  OWNER TO postgres;


Пробовал вот таким способом, не может преобразовать
Код: sql
1.
2.
select func1()::table1;--cannot cast type record to table1
select (func1())::table1;--cannot cast type record to table1


В раздел from вызов засунуть не могу.
...
Рейтинг: 0 / 0
Приведение record к композитному типу
    #38930783
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavel.panshin<>
В раздел from вызов засунуть не могу.
? а почему, собсно

Код: sql
1.
select (func1()::text)::table1;



но лучше таки через честный lateral (я так правильно понимаю, что вам многострочный возврат требуется, но не lateral способ его получить чреват изысками из области теории чисел.

как-то так, например:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
BEGIN;
	create table table1
	as
	(
	select now() col1,now() col2
	);

CREATE FUNCTION func1(OUT c1 timestamp with time zone, OUT c2 timestamp with time zone) RETURNS SETOF record AS
'select now(),now()
UNION ALL
select now(),now()'
LANGUAGE sql VOLATILE NOT LEAKPROOF;
ALTER FUNCTION func1()
  OWNER TO postgres;

  select (func1()::text)::table1;

select 1, test1 FROM (select 1) dual
LEFT  JOIN LATERAL  (SELECT (f.*)::table1 as test1 FROM func1() AS f) fooo
ON TRUE;

rollback; 
...
Рейтинг: 0 / 0
Приведение record к композитному типу
    #38930786
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel.panshin,

Пробуйте объявить функцию так:
Код: sql
1.
CREATE FUNCTION func1(OUT p1 table1) RETURNS SETOF table1



Кстати, как-то очень странно:
Объявляете функцию как возвращающую набор строк, а обращаетесь как если бы она возвращала одну строку.
...
Рейтинг: 0 / 0
Приведение record к композитному типу
    #38930797
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido<>
Кстати, как-то очень странно:
Объявляете функцию как возвращающую набор строк, а обращаетесь как если бы она возвращала одну строку.
это [было] целое искюсство, получить многострочный lateral в версиях до 9.3, с минимальным числом преобразований(или обёрток)

ничего странного.
...
Рейтинг: 0 / 0
Приведение record к композитному типу
    #38930804
pavel.panshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
спасибо, помогло, а есть объяснение, чем преобразование к тексту помогает в данном случае.
вариант с lateral в 9.2 не прокатит.
...
Рейтинг: 0 / 0
Приведение record к композитному типу
    #38930840
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
каст из типа-в-тип должен быть описан.
из псевдотипа record в тип temp1 он постгресу неизвестен.

каст record в текст/из текста в табличный тип -- "описан" для постгреса всегда. (но может быть зависим от настроек -- если у вас даты, времена и т.п. поля, чьё отображение в текст зависит от настроек сеанса)
...
Рейтинг: 0 / 0
Приведение record к композитному типу
    #38930860
pavel.panshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
спасибо еще раз
...
Рейтинг: 0 / 0
Приведение record к композитному типу
    #38930897
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavel.panshin<>вариант с lateral в 9.2 не прокатит.

если речь о том, как развернуть по полям lateral в 9.2 -- то я извращался как-то так (закроем глаза что корелят в параметрах по true)

Код: sql
1.
2.
SELECT a, (f).* FROM
	(select 1 a , func1() f FROM (select 1) dual) foo


-- описано ли это в доке (<9.3) -- не знаю. знаю, что при нескольких set-returning ф-ях в листе вывода всё несколько неожиданно, а весь этот нежданчик описан, сюрприз, -- где то в частной переписке гурьев.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Приведение record к композитному типу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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