процедура и триггер postgresql добавляют условие, выполняющее это только в одной строке, а не во всех

#postgresql #triggers #plpgsql

Вопрос:

сначала я создаю триггер и его процедуру, но в процедуре отсутствует вложенный оператор в части if

 create trigger a_financereconnomiser after update of prix_reel on a_financer execute procedure payetoeconomie() ; 
 

в настоящее время процедура заключается в том, что :

 create or replace function payetoeconomie() returns trigger as $
begin
if (select prix_estim-prix_reel from a_financer) >= 1 then 
insert into  economie (ref,designation,economie ) select ref*1000,date,objet,prix_estim-prix_reel from a_financer where prix_reel ;
end if ; 
end $
language 'plpgsql' ;
 

Если я попытаюсь здесь использовать его, psql ответит, что функция возвращает больше, чем уникальную строку
, это кажется логичным

поэтому мне нужно добавить «и этот столбец, измененный во время обновления» в столбец prix_reel. вот в чем дело, я не понимаю, как это сделать в процедуре.

для информации таблицы строятся следующим образом :

источник первый :

  ref        | integer          |                 | not null  |            | plain    |                       | 
 date       | date             |                 |           |            | plain    |                       | 
 dl         | date             |                 |           |            | plain    |                       | 
 prix_estim | integer          |                 |           |            | plain    |                       | 
 prix_reel  | double precision |                 |           |            | plain    |                       | 
 paye       | integer          |                 |           |            | plain    |                       | 
 objet      | text             |                 |           |            | extended |                       | 
 besoin     | integer          |                 |           |            | plain    |                       | 
 

и пункт назначения один, как :

  ref         | integer          |                 | not null  |            | plain    |                       | 
 date        | date             |                 |           |            | plain    |                       | 
 designation | text             |                 |           |            | extended |                       | 
 economie    | double precision |                 |           |            | plain    |                       | 
 commentaire | text             |                 |           |            | extended |                       | 
 

Ответ №1:

Вы должны знать разницу между функцией триггера и обычной функцией. В любом триггере вы должны использовать преимущества НОВЫХ и СТАРЫХ переменных. Оба являются переменными записи. В случае триггера обновления НОВАЯ переменная является текущей измененной записью, а СТАРАЯ переменная является исходной записью до обновления. ТРИГГЕР обновления обычно должен возвращать НОВУЮ переменную.

Вот как, я думаю, вы хотите, чтобы функция триггера выглядела так:

 create or replace function payetoeconomie() returns trigger as $
DECLARE
  ec double precision;
begin
  ec = NEW.prix_estim - NEW.prix_reel; 
  IF ec >= 1 THEN
    insert into  economie (ref,designation,economie) VALUES (NEW.ref*1000, NEW.objet, ec);
  END IF;
  RETURN NEW;
end $
language 'plpgsql' ;
 

Комментарии:

1. мы как раз на пороге этого ; процедура жалуется на возврат более одной строки одновременно. Я пытаюсь его адаптировать.