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
相关产品推荐
相关产品推荐

