PostgreSQL:INSERT函数之前的UPDATE

时间:2019-01-15 10:09:30

标签: postgresql triggers

为触发器创建函数时出现问题。我想在将数据插入数据库之前更新插入的值。 我的代码如下:

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说: control reached end of trigger procedure without RETURN Where: PL/pgSQL function test_func()

2 个答案:

答案 0 :(得分:3)

该错误表明您必须从触发器(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;

Demo

答案 1 :(得分:1)

您的触发函数只是缺少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;