如何将 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_num
和 total_width
)所以我可以使用它们并使用 SELECT INTO
但我只看过带有单个变量/SELECT
语句的示例。如果我有更多呢?
编辑:我不确定这里的重点是变量的使用还是实际的IF
。这是对后者的回答:
您可以使用 HAVING
和 EXISTS
在没有变量的情况下执行此操作。
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;
这是我想要实现的目标:
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_num
和 total_width
)所以我可以使用它们并使用 SELECT INTO
但我只看过带有单个变量/SELECT
语句的示例。如果我有更多呢?
编辑:我不确定这里的重点是变量的使用还是实际的IF
。这是对后者的回答:
您可以使用 HAVING
和 EXISTS
在没有变量的情况下执行此操作。
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;