postgresql - функция триггера с условием - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь создать триггер с условием. Исходя из длины geom, я хочу, чтобы атрибут "nom" (= имя) был написан в верхнем или нижнем регистре.

вот что у меня есть:

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();

С этим у меня есть ошибка «более одной строки возвращено подзапросом»

На основании других вопросов на этом форуме я пробовал использовать регистр вместо if и, когда в самом триггере не функция, но ни одна из них не работает

Есть идеи? Спасибо

1 Ответ

1 голос
/ 15 января 2020

Вам не нужно (или вы действительно можете) использовать операторы 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;  
...