структура запроса не соответствует типу результата функции postgresql

У меня есть эта функция, которая принимает Varchar в качестве входных данных и выдает таблицу в качестве вывода.

create or replace function historial_reproductivo_vaca(hierro_v varchar) returns table(hierro_toro varchar, sexo varchar, fecha_nacimiento varchar, peso_nacimiento numeric, peso_destete numeric, clasificacion varchar, estado varchar)
as $$
    declare
        estado varchar;
    begin 
        create temporary table temp_table AS
        select hijos.hierro_padre as toro, hijos.sexo as s, hijos.fecha_nacimiento as nacimiento, hijos.hierro as hierro, pesos.peso_nacimiento, pesos.peso_12_meses, hijos.clasificacion FROM
        ((select animales.hierro, animales.sexo, animales.fecha_nacimiento, animales.hierro_madre, animales.hierro_padre, animales.clasificacion from animales) 
        union (select defuncion.hierro, defuncion.sexo, defuncion.fecha_nacimiento, defuncion.hierro_madre, defuncion.hierro_padre, defuncion.clasificacion from defuncion) 
        union (select venta_carne.hierro, venta_carne.sexo, venta_carne.fecha_nacimiento, venta_carne.hierro_madre, venta_carne.hierro_padre, venta_carne.clasificacion from venta_carne) 
        union (select venta_finca.hierro, venta_finca.sexo, venta_finca.fecha_nacimiento, venta_finca.hierro_madre, venta_finca.hierro_padre, venta_finca.clasificacion from venta_finca))as hijos
        JOIN pesos ON pesos.hierro = hijos.hierro;
        alter table temp_table add estado varchar;
        --call update_temp_table(temp_table.hierro) from temp_table;
        return QUERY SELECT * from temp_table;
    end;
$$ language plpgsql;

Но проблема не в этом, проблема в том, что когда я выполняю Select historial_reproductivo_vaca('anything'), я получаю это сообщение: structure of query does not match function result type Интересно, может ли кто-нибудь помочь мне, пожалуйста. Спасибо ребята


person Daniel28    schedule 08.05.2020    source источник
comment
Добро пожаловать в stackoverflow. Совершите экскурсию и получите свой первый значок-stackoverflow.com/tour   -  person Hemant    schedule 08.05.2020
comment
Сохранение промежуточных результатов во временных таблицах обычно не требуется в Postgres. Все, что вы делаете в этой временной таблице обновлений, может быть сделано гораздо эффективнее непосредственно в самом QUERY.   -  person a_horse_with_no_name    schedule 08.05.2020
comment
Не имеет отношения к вашей проблеме, но: поскольку ваша функция определена как returns table, вы должны использовать ее как таблицу и поместить в предложение FROM: select * from historial_reproductivo_vaca(..)   -  person a_horse_with_no_name    schedule 08.05.2020


Ответы (1)


Ошибка, которую вы получаете, связана с тем, что ваш запрос возвращает 8 столбцов, но ваша функция определена для возврата 7.

Ваш запрос на создание временной таблицы возвращает 7 столбцов, а затем вы добавляете в таблицу еще один столбец. Таким образом, ваш select * возвращает 8 столбцов, которые сопоставляются следующим образом:

selected column (from temp table)     declared output column
---------------------------------------------------------------
toro                                  hierro_toro
s                                     sexo
nacimiento                            fecha_nacimiento
hierro                                peso_nacimiento
peso_nacimiento                       peso_destete
peso_12_meses                         clasificacion
clasificacion                         estado
estado (added column)                 ?????

Учитывая имена столбцов результатов и имена выбранных столбцов, кажется, вы просто забыли добавить (выбранный) столбец hierro в столбцы результатов функции.

person a_horse_with_no_name    schedule 08.05.2020