powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция, возвращающая набюор данных
11 сообщений из 11, страница 1 из 1
Функция, возвращающая набюор данных
    #39092096
Alexey Agafonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Пишу функцию

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION testspeed_out (it numeric(20), OUT newit numeric(20))
 RETURNS setof record
 AS
 $$
  SELECT j::numeric(20) As itprod
    FROM generate_series(1,it::bigint) As j;
 
 $$
 LANGUAGE 'sql' VOLATILE;



Не работает, ошибка
Код: plaintext
ERROR: function result type must be numeric because of OUT parameters

В чем может быть причина?
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092100
Alexey Agafonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой работающий вариант:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION testspeed_table(it numeric(20))
 RETURNS TABLE(newit numeric(20))
 AS
 $$
  SELECT j::numeric(20)
    FROM generate_series(1,$1::bigint) As j;
 
 $$
 LANGUAGE 'sql' VOLATILE;



И меня он, в принципе, устраивает. Но вопрос для понимания остается. Почему конструкция "RETURNS setof record" требует минимум два поля? Или причина в чем-то другом? В документаци ответа на этот вопрос я не нашел. Все примеры с одним полем там описаны через return table (...)
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092124
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Agafonov,

Причина, скорее всего, здесь:
RETURNS setof record

Пробуйте вместо этого написать
RETURNS setof NUMERIC

Сейчас в выходных условиях написано возвращение записи. Хотя по факту возвращается NUMERIC (не запись), о чем и сказано в тексте ошибки.
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092251
Alexey Agafonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

согласен, я тоже об этом думал. По очень простой (вроде бы) логике, numeric - это частный случай record записи. Она просто состоит из одного поля. Вот это меня и смутило. Отход от теории множеств (один элемент - это частный случай множества).
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092294
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Agafonov,

numeric — не частный случай record, даже если record содержит единственное поле типа numeric. Это так же, как значение отдельно взятого поля не является частным случаем записи.
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092299
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2Alexey Agafonov,

numeric — не частный случай record, даже если record содержит единственное поле типа numeric. Это так же, как значение отдельно взятого поля не является частным случаем записи.
спор тупоконечников с остроконечниками

т.е. вот так вот -- на голубом глазу -- отказывают в праве иметь запись шириной в одно поле
хоть уписайсо -- всё божья роса

понятно, почему так реализовано -- чтобы вот за эту общность не платить (за компаундный record в C )

но и неудобно в некоторых случаях -- вырождение записи в одно поле приходится обставлять отдельным кодом, даже зная, что так оно быстрее -- а не греет
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092312
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqотказывают в праве иметь запись шириной в одно поле
Кто вам отказывает?
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092361
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2qwwqотказывают в праве иметь запись шириной в одно поле
Кто вам отказывает?
а глаз голубой--голубой
[сколько литров мочи не впитай]

вот же, ять, второе счастье
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092703
Alexey Agafonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqно и неудобно в некоторых случаях -- вырождение записи в одно поле приходится обставлять отдельным кодом, даже зная, что так оно быстрее -- а не греет
Полностью согласен, потому что так (см ниже) - работает. Всего лишь добавил еще одну колонку.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION testspeed_out (it numeric(20), OUT newit numeric(20), out ttt int)
 RETURNS setof record
 AS
 $$
  SELECT j::numeric(20) As itprod, 123::int as t
    FROM generate_series(1,it::bigint) As j;
 
 $$
 LANGUAGE 'sql' VOLATILE;
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092711
Alexey Agafonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для PostgreSQL setof record - это от ДВУХ колонок. Хотя в классике (и БД и вообще математике) один элемент - это тоже частный случай множества, совсем строго "набор" - это от одного и более элемента. Например, вполне уместна формулировка "наш набор представлен в виде одной колонки айдишников..." и так далее. Тут же странно. Как гвоздями в ядро прибито, что если set of record, но при этом один выходной параметр - не дадим. Причина непонятна, правда, что при наборе типизированных процедур у тех, у который одна колонка, писать надо иначе... Собственно, с чем я и столкнулся, создав эту тему.
...
Рейтинг: 0 / 0
Функция, возвращающая набюор данных
    #39092880
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey AgafonovДля PostgreSQL setof record - это от ДВУХ колонок. Хотя в классике (и БД и вообще математике) один элемент - это тоже частный случай множества, совсем строго "набор" - это от одного и более элемента. Например, вполне уместна формулировка "наш набор представлен в виде одной колонки айдишников..." и так далее. Тут же странно. Как гвоздями в ядро прибито, что если set of record, но при этом один выходной параметр - не дадим. Причина непонятна, правда, что при наборе типизированных процедур у тех, у который одна колонка, писать надо иначе... Собственно, с чем я и столкнулся, создав эту тему.
вообще то
Код: sql
1.
SELECT ROW(1::numeric) AS a


вполне себе возвращает рекорд из 1 поля. и именно компаунд

и поле из него с типом вы уже не выдерете
Код: sql
1.
2.
SELECT  (ROW(1::numeric)).*
ERROR:  record type has not been registered

а алиасом с типами -- как в случае record returning ф-ии, попользоваться не дадут.

просто вместо того, чтобы сокрыть от пользователя декларации проблемы/тонкости реализации, разрабы пошли по оракл--вею -- запретили "медленный" вариант сетофа компаундов от одного поля. (могли бы его реализовать как сетоф типов поля, сокрыв "снятие избыточной компаунд--обертки" (уже на этапе разбора декларации) от пользователя языка).
эта фигня сделана когда--то в далёком ещё прошлом. В returnin table, который более свежий -- такой фигни уже нет.

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


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