You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:10:20