首页 > 解决方案 > 创建函数以更新 SQL 中的两个表

问题描述

我有两个表,有不同的列,我必须创建一个函数来更新第二个表,当列年份与给定年份匹配时,使用第一个表的信息并将所有表分组到性别组中。

在这里我放了我的代码,但我不知道它是否可以,因为 pgAdmin4 由于 $$ 符号而返回了一个错误,尽管我正在尝试解决它。

BEGIN WORK;

CREATE OR REPLACE FUNCTION update_report(p_year INTEGER) 
RETURNS SETOF report1 AS $$
DECLARE report report1;
BEGIN
UPDATE report1 SET m.num=t_num, m.na=t_na, m.nd=t_nd, m.birth=t_birth
FROM report2 m
    FULL JOIN report1
    ON p_year= m.year
GROUP BY m.gender);

   --In case there are any film in the specified year
IF NOT FOUND THEN
    RAISE EXCEPTION  ‘’%: No film exists in this year’’, -746;
END IF;
RETURN report;

END;
$$ LANGUAGE plpgsql;

COMMIT WORK;

有人可以告诉它是否可以吗?谢谢

标签: sqlpostgresqlplpgsqlstored-functions

解决方案


我不确定“按性别分组”应该是什么意思,但我认为您正在寻找一个简单的更新。

请注意,您不应UPDATE 语句的 FROM 子句中重复目标表。

从手册中引用

注意,目标表不能出现在 from_list 中,除非您打算进行自联接

您没有向我们展示任何示例数据和预期结果或表格结构,所以我只能猜测,您到底想要什么,但可能是这样的:

UPDATE report1 r1
   SET num = r2.t_num, 
       na = r2.t_na, 
       nd = r2.t_nd
       birth = r.t_birth
FROM report2 r2
WHERE r1.year = r2.year
  AND r1.gender = r2.gender
  AND r1.year = p_year= m.year;

如果要返回所有已更改的行,则可以使用该RETURNING子句。你不需要一个declare。使用language sql而不是 PL/pgSQL 使这更加简单:

CREATE OR REPLACE FUNCTION update_report(p_year INTEGER) 
   RETURNS SETOF report1 
AS $$
  UPDATE report1 r1
     SET num = r2.t_num, 
         na = r2.t_na, 
         nd = r2.t_nd
         birth = r.t_birth
  FROM report2 r2
  WHERE r1.year = r2.year
    AND r1.gender = r2.gender
    AND r1.year = p_year= m.year
  RETURNING r1.*; --<< return all modified rows
$$ 
LANGUAGE sql;

推荐阅读