在postgres触发器中使用子字符串有问题这里是我使用的触发器
CREATE FUNCTION TRIGGER1() RETURNS trigger AS $autouuid$
BEGIN
update test_points.scada_rtu i
set dummy #field_name
= upper(substr (NEW.city_name, 1, 2) || right (NEW.city_name, 1) || '-' || substr (NEW.phase_name, 1, 2) || right (NEW.phase_name, 1) || '-' || substr (NEW.area_name, 1, 3) || '-' ||
substr(NEW.name, 1, 2) || right (NEW.name, 1) || '-' || substr (NEW.rtu_model, 1, 2) || right (NEW.rtu_model, 1))
WHERE i.id = OLD.id;
RETURN NEW;
END;
$autouuid$ LANGUAGE plpgsql;
CREATE TRIGGER autouuid_update BEFORE INSERT OR UPDATE ON test_points.scada_rtu
FOR EACH ROW
EXECUTE PROCEDURE public.TRIGGER1();发布于 2021-11-29 21:07:29
CREATE FUNCTION TRIGGER1() RETURNS trigger AS $autouuid$
BEGIN
NEW.dummy=upper(
concat_ws('-',
regexp_replace(NEW.city_name, '^(..).*(.)$', '\1\2'),
regexp_replace(NEW.phase_name, '^(..).*(.)$', '\1\2'),
regexp_replace(NEW.name, '^(..).*(.)$', '\1\2'),
regexp_replace(NEW.rtu_model, '^(..).*(.)$', '\1\2')
)
);
RETURN NEW;
END;
$autouuid$ LANGUAGE plpgsql;
CREATE TRIGGER autouuid_update BEFORE INSERT OR UPDATE ON test_points.scada_rtu
FOR EACH ROW
EXECUTE PROCEDURE public.TRIGGER1();NEW记录,而无需发出新的更新。NEW将解决您的问题,因为它将在触发器的上下文中操作,其中触发器特殊变量是可见的。您的错误是由于update查询认为它是对目标表的一个列的引用而导致的,而忽略了变量。@禤浩焯·克劳弗||重复连接和手动添加分隔符。concat_ws()为您做了这两件事,同时也忽略了NULL值。regexp_replace()完成。#comment不是有效的PL/pgSQL注释。单行行尾使用--comment,多行中线注释使用/*comment*/ .您的注释将与函数定义一起保存,并且每当有人查找它时都可以看到。https://stackoverflow.com/questions/70158790
复制相似问题