PostgreSQL存储过程不允许使用SELECT INTO并抛出错误“;与无法返回数据的命令一起使用;

PostgreSQL存储过程不允许使用SELECT INTO并抛出错误“;与无法返回数据的命令一起使用;,sql,database,postgresql,Sql,Database,Postgresql,这个存储过程只是在表中插入一些值,但是当我试图返回一个类型来显示插入的值时,它让我感到非常痛苦。我已经声明了一个变量(report_tab)和我想要返回的类型(report_building_style_type),但是如果我试图通过SELECT INTO填充它(无论我在哪个SELECT中尝试),它都会抛出“Error:与无法返回数据的命令一起使用” 我试图找出这意味着什么以及如何解决它,甚至检查了一些与previus stackoverflow相关的问题,但实际上找不到答案 这是我目前的代码:

这个存储过程只是在表中插入一些值,但是当我试图返回一个类型来显示插入的值时,它让我感到非常痛苦。我已经声明了一个变量(report_tab)和我想要返回的类型(report_building_style_type),但是如果我试图通过SELECT INTO填充它(无论我在哪个SELECT中尝试),它都会抛出“Error:与无法返回数据的命令一起使用”

我试图找出这意味着什么以及如何解决它,甚至检查了一些与previus stackoverflow相关的问题,但实际上找不到答案

这是我目前的代码:

CREATE OR REPLACE FUNCTION update_report_building_style(p_year integer)
RETURNS report_building_style_type
AS $$
DECLARE
found_bld building.id_building%TYPE;
report_tab report_building_style_type;
BEGIN
FOR found_bld IN
SELECT m.id_building into report_tab.t_id_building
FROM building m
WHERE EXTRACT(YEAR FROM m.birth) = p_year
LOOP
INSERT INTO report_building_style
SELECT INTO 
report_tab.t_id_building,
report_tab.t_ style ,
report_tab.t_ num_firms,
report_tab.t_ stages,
report_tab.t_average_building_height
DISTINCT 
T1.id_building, 
T1.style, 
T2.num_firms, 
T3.num_stages, 
T4.num_built_buildings, 
T5.average_building_height
FROM 
(SELECT 
x0.id_building, 
firm.style
FROM firm, 
(SELECT building.name, building.id_building, id_firm 
FROM building 
INNER JOIN member
ON building.id_building = member.id_building
WHERE building.id_building = found_bld
GROUP BY building.id_building, building.name, id_firm) as x0
WHERE firm.id_firm = x0.id_firm
GROUP BY x0.id_building, x0.name, x0.id_firm, firm.style) AS T1
INNER JOIN 
(SELECT x1.id_building, x1.name, COUNT(*) AS num_firms 
FROM (SELECT building.name, building.id_building, id_firm
FROM building
INNER JOIN member
ON building.id_building = member.id_building
WHERE building.id_building = found_bld
GROUP BY member.id_firm, building.id_building, building.name) as x1
GROUP BY x1.id_building, x1.name) AS T2
ON T1.id_building = T2.id_building
INNER JOIN 
(SELECT x2.id_building, x2.name, COUNT(*) AS num_stages
FROM (SELECT building.name, building.id_building, member.id_firm
FROM building
INNER JOIN member
ON building.id_building = member.id_building
INNER JOIN stage
ON stage.id_firm = member.id_firm
WHERE building.id_building = found_bld   
GROUP BY stage.id_stage, member.id_firm, building.id_building, building.name) as x2
GROUP BY x2.id_building, x2.name
ORDER BY x2.id_building) AS T3
ON T3.id_building = T2.id_building
INNER JOIN 
(SELECT x3.id_building, x3.name, COUNT(*) AS num_built_buildings
FROM (SELECT building.name, building.id_building
FROM building
INNER JOIN architect
ON architect.id_building = building.id_building
WHERE building.id_building = found_bld   
GROUP BY architect.id_building, building.id_building, building.name) as x3
GROUP BY x3.id_building, x3.name
ORDER BY x3.id_building) AS T4
ON T4.id_building = T3.id_building
INNER JOIN 
(select b.id_building, SUM (b.height)/COUNT (*) AS average_building_height 
from (SELECT building.name, building.id_building, building.height, SUM(building.height) AS building_height
FROM building
INNER JOIN architect
ON architect.id_building = building.id_building
INNER JOIN building
ON building.id_building = architect.id_building
WHERE building.id_building = found_bld  
GROUP BY building.id_building, building.name, building.duration, architect.id_building
ORDER BY building.id_building) as b
group by id_building) AS T5 
ON T5.id_building = T3.id_building
ORDER BY T1.id_building
ON CONFLICT (id_building, style) 
DO UPDATE SET 
style = excluded.style,
num_firms = excluded.num_firms,
num_stages = excluded.num_stages,
num_built_buildings = excluded.num_built_buildings,
average_building_height = excluded.average_building_height;
return report_tab;
END LOOP;
END;
$$LANGUAGE plpgsql;

非常感谢。

让您的帮助变得简单-简化!()对于在“选择m.id建筑到报告”选项卡中找到的bld,此
没有任何意义。将
丢失到报告选项卡中。t\u id\u building
部分。非常感谢@Adrian Klaver。但这就是问题所在,如果我丢失了“进入报告”部分,我如何填写“报告”选项卡以便返回结果?您没有执行
选择进入报告选项卡
您正在执行
选择进入报告选项卡.t\u id\u building
m.id\u building
。只需使用
m.id\u大楼
。稍后,在插入到
中时,您会遇到类似的问题。我将丢失该部分查询,只需使用长
SELECT
查询中的数据执行
SELECT INTO report_选项卡。*
。然后使用
report_选项卡。*
values将
插入到
Wow中,谢谢@Adrian Klaver,它非常出色,工作正常!