如何将 select 放入触发函数内的多个变量?

How to select into multiple variables inside a trigger function?

这是我想要实现的目标:

CREATE FUNCTION f() RETURNS trigger AS $$
  BEGIN
    SELECT COUNT(*) AS total_num, SUM(width) AS total_width
    FROM some_table WHERE foo = NEW.foo;
    IF total_num > 0 AND total_width > 100
    THEN
      RAISE EXCEPTION 'this is bad';
    END IF;
    RETURN NEW;
  END;
$$ LANGUAGE plpgsql;

但它在语法上还不正确。

我读过我首先需要 DECLARE 变量(在本例中为 total_numtotal_width)所以我可以使用它们并使用 SELECT INTO 但我只看过带有单个变量/SELECT 语句的示例。如果我有更多呢?

编辑:我不确定这里的重点是变量的使用还是实际的IF。这是对后者的回答:


您可以使用 HAVINGEXISTS 在没有变量的情况下执行此操作。

IF EXISTS (SELECT ''
                  FROM some_table
                  WHERE foo = new.foo
                  HAVING count(*) > 0
                         AND sum(width) > 100) THEN
  RAISE EXCEPTION 'this is bad';
END IF;

您可以列出 multiple variables in the into part. And the declare section 需要在第一个 begin 之前:

CREATE FUNCTION f() RETURNS trigger 
AS $$
declare
  total_num bigint;
  total_width bigint;
BEGIN
   SELECT COUNT(*), SUM(width)
       into total_num, total_width
   FROM some_table 
   WHERE foo = NEW.foo;

   IF total_num > 0 AND total_width > 100 THEN
      RAISE EXCEPTION 'this is bad';
   END IF;
   RETURN NEW;
END;
$$ LANGUAGE plpgsql;