分享
三行代码  ›  专栏  ›  技术社区  ›  oph

postgresql-带条件的触发器函数

  •  0
  • oph  · 技术社区  · 4 天前

    CREATE OR REPLACE FUNCTION public.test_upper_lower()  
    RETURNS trigger AS  
        $BODY$
            BEGIN  
                NEW.dummy:= (ST_Length(new.geom)); 
                if (SELECT dummy FROM ligne_ligne)>100 
                then NEW.nom:= LOWER(nom) FROM ligne_ligne; 
                else NEW.nom:= UPPER(nom) FROM ligne_ligne;  
                end if;
                RETURN NEW;
            END;
        $BODY$
    LANGUAGE plpgsql;  
    DROP trigger IF EXISTS test_upper_lower on public.ligne_ligne;  
    CREATE trigger test_upper_lower BEFORE INSERT OR UPDATE on public.ligne_ligne  
        FOR EACH ROW 
        EXECUTE PROCEDURE public.test_upper_lower();
    

    有了这个,我有一个“多行由子查询返回”错误

    基于这个论坛上的其他问题,我尝试使用case,而不是if和when,在触发器本身不起作用,但两者都不起作用

    有什么想法吗? 谢谢

    1 回复  |  直到 4 天前
        1
  •  0
  •   a_horse_with_no_name    4 天前

    你不需要(或者实际上可以)使用 SELECT 从插入行访问数据的语句。

    SELECT dummy FROM ligne_ligne 回报 全部的

    因为您只想检查刚刚计算的值,所以只需使用 new.dummy 在那一点上:

    CREATE OR REPLACE FUNCTION public.test_upper_lower()  
    RETURNS trigger AS  
    $BODY$
    BEGIN  
      NEW.dummy:= ST_Length(new.geom); 
      if new.dummy > 100 then --<< no SELECT necessary
        NEW.nom:= LOWER(new.nom); --<< no "FROM", just access the value 
      else 
        NEW.nom:= UPPER(new.nom);  
      end if;
      RETURN NEW;
    END;
    $BODY$
    LANGUAGE plpgsql;