PostgreSQL:更新前插入函数

4

我在创建触发器的函数时遇到了问题。 我希望在将数据插入数据库之前更新插入的值。我的代码如下:

CREATE OR REPLACE FUNCTION test_func()
RETURNS TRIGGER AS 
$$
DECLARE cnt INTEGER;
BEGIN
    cnt := COUNT(*) FROM sample_tbl WHERE id = NEW.id AND created_date = NEW.created_date;
    NEW.current_order := cnt + 1; // I want to set value of sample_tbl.current_order automatically
END 
$$ LANGUAGE plpgsql;


CREATE TRIGGER test_trigger
BEFORE INSERT
ON test_tbl
FOR EACH ROW
EXECUTE PROCEDURE test_func();

我插入了数据,然后IDE提示: 控制流程到达触发器过程的结尾,但没有返回。 位置:PL/pgSQL函数test_func()

2个回答

4
错误提示表示您必须从触发器中返回一些内容(NEWNULL)。这并不需要使用触发器。使用此选择查询的简单 View 将为您提供所需的结果。
--create or replace view sample_view as
select t.id, t.created_date,
       row_number() OVER ( partition by  id,created_date order by id ) as current_order
FROM sample_tbl t;

这将完全匹配记录,如果使用触发器进行更新。
CREATE OR REPLACE FUNCTION test_func()
RETURNS TRIGGER AS 
$$
DECLARE cnt INTEGER;
BEGIN
    select COUNT(*) INTO cnt FROM sample_tbl WHERE id = NEW.id 
      AND created_date = NEW.created_date;
    NEW.current_order := cnt + 1; 
RETURN NEW; --required
END 
$$ LANGUAGE plpgsql;

演示


非常容易理解 - Dexter

2
您的触发函数只是缺少RETURN NEW;语句:
您的触发器函数需要添加RETURN NEW;语句。
CREATE OR REPLACE FUNCTION test_func()
RETURNS TRIGGER AS 
$$
DECLARE cnt INTEGER;
BEGIN
    cnt := COUNT(*) FROM sample_tbl WHERE id = NEW.id AND created_date = NEW.created_date;
    NEW.current_order := cnt + 1;
    RETURN NEW;
END 
$$ LANGUAGE plpgsql;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接