СУММА 2 значений из одной строки - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в postgresql 9.3 и попал в беду из-за простой операции.Я должен выполнить с помощью триггера сумму числовых значений двух столбцов и записать результат в третий столбец.Это моя стартовая таблица:

CREATE TABLE pratica
(
  progressivo text NOT NULL DEFAULT nextval('pratica_prog_seq'::regclass),
  sal1_importo_arc numeric(10,2),
  sal1_spese numeric(10,2),
  sal1_totale numeric(10,2),
   note text,
  CONSTRAINT pratica_pkey PRIMARY KEY (progressivo)
)
WITH (
  OIDS=FALSE
);

А это функция и триггер:

CREATE OR REPLACE FUNCTION sum_sal1()
RETURNS trigger AS
$$
BEGIN
IF NEW.sal1_importo_arc IS NULL
THEN
UPDATE pratica
SET sal1_totale = NEW.sal1_spese
WHERE pratica.sal1_totale IS DISTINCT FROM pratica.sal1_spese;
ELSE IF NEW.sal1_spese  IS NULL
THEN
UPDATE pratica
SET sal1_totale = NEW.sal1_importo_arc
WHERE pratica.sal1_totale IS DISTINCT FROM pratica.sal1_importo_arc;
ELSE
UPDATE pratica
SET sal1_totale = (SELECT (NEW.sal1_importo_arc + NEW.sal1_spese))
WHERE pratica.sal1_totale IS DISTINCT FROM (SELECT (pratica.sal1_importo_arc + pratica.sal1_spese));
END IF;
END IF;
RETURN NULL;
END
$$
  LANGUAGE plpgsql VOLATILE

CREATE TRIGGER sum_sal1
  AFTER INSERT OR UPDATE OF sal1_importo_arc
  ON pratica
  FOR EACH ROW
  EXECUTE PROCEDURE sum_sal1();

Столбцы sal1_spese и sal1_importo_arc могут содержать значения NULL и, следовательно,Я поставил соответствующие условия.Проблема заключается в том, что при срабатывании триггера он обновляет столбец sal1_total всей таблицы тем же значением измененной строки, а не только строкой объекта изменения.Что я не прав?Спасибо

1 Ответ

0 голосов
/ 08 октября 2018

Используйте COALESCE() в выражениях, которые могут содержать NULL.

Нет необходимости обновлять таблицу каждый раз, когда необходимо вычислить значение, так как вы можете использовать триггерBEFORE таким простым способом:

CREATE OR REPLACE FUNCTION sum_sal1()
RETURNS trigger AS
$$
BEGIN
    NEW.sal1_totale = COALESCE(NEW.sal1_importo_arc, 0) + COALESCE(NEW.sal1_spese, 0);
    RETURN NEW;
END
$$
  LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER sum_sal1
  BEFORE INSERT OR UPDATE
  ON pratica
  FOR EACH ROW
  EXECUTE PROCEDURE sum_sal1(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...