Задать вопрос
@newbie_python

Почему возникает ошибка «Final statement returns bigint instead of integer» в SQL функции?

Добрый день! Подскажите, пож-та, с чем может быть связано возникновение ошибки при попытке создания табличной функции в БД POSTGRESQL?:
ERROR:  return type mismatch in function declared to return record
DETAIL:  Final statement returns bigint instead of integer at column 2.


Типы данных атрибутов в источниках (корневых) таблицах совпадает с тем, что у меня в запросе, возможно что-то не верно в самой структуре функции? Перерыл гугл не нашел решения :(

P.S. Пробовал "поиграться" с этими атрибутами и при таком виде начала запроса (убрал большинство атрибутов и поменял тип):
create or replace function "bd"."function"("reg" int4, "date" date)
  returns table("4.1" int4, "5.1" bigint, ) as $body$


Уже возникает другая ошибка:
ERROR:  return type mismatch in function declared to return record
DETAIL:  Final statement returns too many columns.


Сам запрос: https://ps.tmpc.ru/6927e42610e7
  • Вопрос задан
  • 452 просмотра
Подписаться 1 Сложный Комментировать
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Не соответствуют типы данных как они объявлены в выходных параметрах функции и тем, что вы пытаетесь делать в return. Должны соответствовать друг другу.

sum у нас в pg13 существуют такие:
melkij=> \da pg_catalog.sum
                                              Список агрегатных функций
   Схема    | Имя | Тип данных результата | Типы данных аргументов |                     Описание                     
------------+-----+-----------------------+------------------------+--------------------------------------------------
 pg_catalog | sum | numeric               | bigint                 | sum as numeric across all bigint input values
 pg_catalog | sum | double precision      | double precision       | sum as float8 across all float8 input values
 pg_catalog | sum | bigint                | integer                | sum as bigint across all integer input values
 pg_catalog | sum | interval              | interval               | sum as interval across all interval input values
 pg_catalog | sum | money                 | money                  | sum as money across all money input values
 pg_catalog | sum | numeric               | numeric                | sum as numeric across all numeric input values
 pg_catalog | sum | real                  | real                   | sum as float4 across all float4 input values
 pg_catalog | sum | bigint                | smallint               | sum as bigint across all smallint input values

Как видно, нет ни одного варианта, который бы возвращал int4

Final statement returns too many columns действительно надо пояснять? Или прямым английским языком всё и так уже сказано?
Ответ написан
@galaxy
sum(int) возвращает bigint в постгресе (иначе легко было бы нарваться на переполнение)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы