PostgreSQL Trigger с двумя операторами функций - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать триггер для двух разных функций, с разницей только в условии:

CREATE OR REPLACE FUNCTION seculoxxi()
    RETURNS integer AS $total1$
    declare
        total1 integer;
    BEGIN
       SELECT count(*) into total1 
       FROM edicao
       WHERE ano >= 2000;
       RETURN total1;
    END;
    $total1$ LANGUAGE plpgsql;

и

CREATE OR REPLACE FUNCTION seculoxx()
RETURNS integer AS $total2$
declare
    total2 integer;
BEGIN
   SELECT count(*) into total2 
   FROM edicao
   WHERE ano < 2000;
   RETURN total2;
END;
$total2$ LANGUAGE plpgsql;

Структура таблицы также простаЕсть три строки:

  1. Код (числовой)
  2. Версия (символ)
  3. Год (целое число)

Как можноЯ создаю этот триггер?

1 Ответ

0 голосов
/ 26 ноября 2018

Это полный выстрел в темноте, но если предположить, что поле, которое вы хотите изменить, называется «счетчики», то я думаю, что триггер может выглядеть так:

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
DECLARE
  total integer;
BEGIN
  select count (*)
  into total
  from edicao e
  where
    (NEW.ano >= 2000 and e.ano >= 2000) or
    (NEW.ano < 2000 and e.ano < 2000);

  NEW.counter := total;

  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Затем, чтобы добавить триггерк вашей таблице:

CREATE TRIGGER insert_edicao_trigger
  BEFORE INSERT
  ON edicao
  FOR EACH ROW
  EXECUTE PROCEDURE edicao_insert_trigger()

Теперь, когда вы делаете вставку, он должен автоматически добавить значение для поля "counter".

Для записи, если вы пытаетесь получитьуникальный идентификатор, было бы намного лучше использовать последовательность.

create sequence edicao_gt_2000;
create sequence edicao_lt_2000;

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
  NEW.counter :=
    case
      when NEW.ano >= 2000 then nextval ('edicao_gt_2000')
      else nextval ('edicao_lt_2000')
    end;
  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
...