#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. мы как раз на пороге этого ; процедура жалуется на возврат более одной строки одновременно. Я пытаюсь его адаптировать.