postgresql - 带条件的触发函数
postgresql - trigger function with condition
我正在尝试创建一个带条件的触发器。根据几何长度,我希望属性 "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();
有了这个我有一个 "more than one row returned by a subquery" 错误
根据这个论坛上的其他问题,我尝试使用 case 而不是 if 并在触发器本身中使用 when 而不是函数,但两者都不起作用
有什么想法吗?
谢谢
您不需要(或者实际上可以)使用 SELECT
语句来访问插入行中的数据。
部分 SELECT dummy FROM ligne_ligne
returns all 行来自 table - 不仅仅是来自与触发器相关的行。
由于您只是想检查刚刚计算的值,因此只需在该点使用 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;
我正在尝试创建一个带条件的触发器。根据几何长度,我希望属性 "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();
有了这个我有一个 "more than one row returned by a subquery" 错误
根据这个论坛上的其他问题,我尝试使用 case 而不是 if 并在触发器本身中使用 when 而不是函数,但两者都不起作用
有什么想法吗? 谢谢
您不需要(或者实际上可以)使用 SELECT
语句来访问插入行中的数据。
部分 SELECT dummy FROM ligne_ligne
returns all 行来自 table - 不仅仅是来自与触发器相关的行。
由于您只是想检查刚刚计算的值,因此只需在该点使用 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;