首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgres子字符串触发器问题

postgres子字符串触发器问题
EN

Stack Overflow用户
提问于 2021-11-29 17:25:30
回答 1查看 125关注 0票数 0

在postgres触发器中使用子字符串有问题这里是我使用的触发器

代码语言:javascript
复制
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();

错误信息

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-29 21:07:29

代码语言:javascript
复制
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();
  1. 正如名字所指出的,您可以直接将新值分配给NEW记录,而无需发出新的更新。
  2. 从更新时触发的函数发出新更新会使其调用自己,使您处于一个无限循环中,正如@Frank Heikens所指出的那样。
  3. 直接分配给-type变量NEW将解决您的问题,因为它将在触发器的上下文中操作,其中触发器特殊变量是可见的。您的错误是由于update查询认为它是对目标表的一个列的引用而导致的,而忽略了变量。@禤浩焯·克劳弗
  4. 您不需要每次使用||重复连接和手动添加分隔符。concat_ws()为您做了这两件事,同时也忽略了NULL值。
  5. 获取字符串的前两个字符和最后一个字符也可以使用单个regexp_replace()完成。
  6. #comment不是有效的PL/pgSQL注释。单行行尾使用--comment,多行中线注释使用/*comment*/ .您的注释将与函数定义一起保存,并且每当有人查找它时都可以看到。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70158790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档