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

PostgreSQL 16中BEFORE INSERT触发器PL/pgSQL函数CASE WHEN报错求助

问题排查与修正

你的PL/pgSQL函数存在两个关键错误,导致无法正常运行:

1. CASE表达式用法错误

CASE是返回值的表达式,不能在THEN分支里写赋值语句。你写的new.class = 'DOM'会被PostgreSQL当成布尔判断(检查new.class是否等于'DOM'),完全违背了你要给new.class赋值的意图。

2. 变量名拼写不一致

你声明的变量是categ_prop,但代码里调用的是kateg_prop,这种拼写错误会直接触发变量未定义的报错。而且这个变量本身是多余的,没必要额外声明,直接给new.class赋值即可。


修正后的函数代码

去掉冗余变量,用CASE表达式直接返回对应值并赋值给new.class:

CREATE OR REPLACE FUNCTION Xupd_cat_prop()
RETURNS TRIGGER
AS
$$ 
BEGIN
    new.class := CASE
        WHEN new.cat_tarif IN ('domestic_1', 'domestic_2') THEN 'DOM'
        WHEN new.cat_tarif = 'nondomestic_1' THEN 'NONDOM'
        WHEN new.cat_tarif = 'industry' THEN 'IND'
        -- 可选:添加ELSE分支处理未匹配的情况,避免new.class为NULL
        ELSE new.class -- 保持原有值,或设为默认值如'UNKNOWN'
    END;
    RETURN new; 
END;
$$ 
LANGUAGE plpgsql;

补充:创建对应BEFORE INSERT触发器

函数编写完成后,需要绑定到目标表(假设表名为your_table):

CREATE TRIGGER trigger_update_class_before_insert
BEFORE INSERT ON your_table
FOR EACH ROW
EXECUTE FUNCTION Xupd_cat_prop();

额外说明

  • 用IN ('domestic_1', 'domestic_2')替代OR,代码更简洁易读。
  • 建议添加ELSE分支,避免当cat_tarif出现未匹配值时,class字段被设为NULL(若表不允许class为NULL,会导致插入失败)。

内容的提问来源于stack exchange,提问作者padjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:00:55