PostgreSQL触发器函数报错:未使用RETURN语句终止执行
PostgreSQL触发器函数报错解决:缺失返回值导致的2F005错误
我正在学习PostgreSQL的函数与触发器,需求是:向d_rpt表执行INSERT操作时,触发语句级触发器,通过TRUNCATE和INSERT更新sm_rpt表。已创建触发器函数ins_trig_func和触发器nw_wn,但测试触发时出现报错:
ERROR: control reached end of trigger procedure without RETURN CONTEXT: PL/pgSQL function insert_trigger_function() SQL state: 2F005
在触发器函数末尾添加RETURN NULL;后问题解决。
相关表结构
cust表
cust_id | email ------- | ----- 1 | jack.daniels@google.com 2 | jose.quervo@yahoo.com 3 | jim.beam@protonmail.com
inv表
fm_id | inv_id ----- |-------- 22 | 10 23 | 11 24 | 12 25 | 13 26 | 14 27 | 15 28 | 16 29 | 17 30 | 18 31 | 19 31 | 20 32 | 21
rent表
inv_id | cust_id | rent_dt ------ |-------- | -------- 10 | 1 | 9/1/2022 10:29 11 | 1 | 9/2/2022 18:16 12 | 1 | 9/2/2022 18:17 13 | 1 | 9/17/2022 17:34 14 | 1 | 9/19/2022 6:32 15 | 1 | 9/19/2022 6:33 16 | 3 | 9/1/2022 18:45 17 | 3 | 9/1/2022 18:46 18 | 3 | 9/2/2022 18:45 19 | 3 | 9/2/2022 18:46 20 | 3 | 9/17/2022 18:32 21 | 3 | 9/19/2022 22:12 10 | 2 | 9/19/2022 11:43 11 | 2 | 9/19/2022 11:42
fm表
fm_id | titl ----- | ----- 22 | Anaconda 23 | Exorcist 24 | Philadelphia 25 | Quest 26 | Sweden 27 | Speed 28 | Nemo 29 | Zoolander 30 | Truman 31 | Patient 32 | Racer
d_rpt表
cust_id | email | fm_id | inv_id | rent_dt ------- | ------------------------- | ----- | ------ | -------- 1 | jack.daniels@google.com | 10 | 22 | 9/1/2022 10:29 1 | jack.daniels@google.com | 11 | 23 | 9/2/2022 18:16 1 | jack.daniels@google.com | 12 | 24 | 9/2/2022 18:17 1 | jack.daniels@google.com | 13 | 25 | 9/17/2022 17:34 1 | jack.daniels@google.com | 14 | 26 | 9/19/2022 6:32 1 | jack.daniels@google.com | 15 | 27 | 9/19/2022 6:33 2 | jose.quervo@yahoo.com | 10 | 22 | 9/19/2022 11:43 2 | jose.quervo@yahoo.com | 11 | 23 | 9/19/2022 11:42 3 | jim.beam@protonmail.com | 16 | 28 | 9/1/2022 18:45 3 | jim.beam@protonmail.com | 17 | 29 | 9/1/2022 18:46 3 | jim.beam@protonmail.com | 18 | 30 | 9/2/2022 18:45 3 | jim.beam@protonmail.com | 19 | 31 | 9/2/2022 18:46 3 | jim.beam@protonmail.com | 20 | 31 | 9/17/2022 18:32 3 | jim.beam@protonmail.com | 21 | 32 | 9/19/2022 22:12
sm_rpt表
email | rd_cnt ------------------------ | ------ jack.daniels@google.com | 6 jim.beam@protonmail.com | 6
初始触发器函数(报错版本)
CREATE FUNCTION ins_trig_func() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN TRUNCATE FROM sm_rpt; INSERT INTO sm_rpt SELECT cust.email, count (DISTINCT inv.fm_id) AS "rd_cnt" FROM cust INNER JOIN rent ON rent.cust_id = cust.cust_id INNER JOIN inv ON inv.inv_id = rent.inv_id INNER JOIN fm ON fm.fm_id = inv.fm_id WHERE rent.rent_dt BETWEEN '2005-08-01' AND '2005-08-31' GROUP BY cust.email ORDER BY "rd_cnt" DESC; END; $$
触发器创建语句
CREATE TRIGGER nw_wn AFTER INSERT ON d_rpt FOR EACH STATEMENT EXECUTE PROCEDURE ins_trig_func();
修正后的触发器函数(解决报错)
CREATE FUNCTION ins_trig_func() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN TRUNCATE FROM sm_rpt; INSERT INTO sm_rpt SELECT cust.email, count (DISTINCT inv.fm_id) AS "rd_cnt" FROM cust INNER JOIN rent ON rent.cust_id = cust.cust_id INNER JOIN inv ON inv.inv_id = rent.inv_id INNER JOIN fm ON fm.fm_id = inv.fm_id WHERE rent.rent_dt BETWEEN '2005-08-01' AND '2005-08-31' GROUP BY cust.email; RETURN NULL; END; $$
内容的提问来源于stack exchange,提问作者Student_OKIE
相关产品推荐
相关产品推荐

