首页 > 解决方案 > postgresql - 有条件的触发函数

问题描述

我正在尝试创建带有条件的触发器。根据几何长度,我希望属性“nom”(= name)以大写或小写形式编写。

这就是我所拥有的:

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 不是函数,但两者都不起作用

有任何想法吗 ?谢谢

标签: postgresqlconditional-statementspostgisplpgsqldatabase-trigger

解决方案


您不需要(或实际上可以)使用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;  

推荐阅读