Postgresql: ОБНОВЛЕНИЕ перед функцией INSERT - PullRequest
0 голосов
/ 15 января 2019

У меня проблема при создании функции для триггера. Я хочу ОБНОВИТЬ вставленное значение ПЕРЕД ВСТАВКОЙ данных в БД. Мой код выглядит так:

CREATE OR REPLACE FUNCTION test_func()
RETURNS TRIGGER AS 
$$
DECLARE cnt INTEGER;
BEGIN
    cnt := COUNT(*) FROM sample_tbl WHERE id = NEW.id AND created_date = NEW.created_date;
    NEW.current_order := cnt + 1; // I want to set value of sample_tbl.current_order automatically
END 
$$ LANGUAGE plpgsql;


CREATE TRIGGER test_trigger
BEFORE INSERT
ON test_tbl
FOR EACH ROW
EXECUTE PROCEDURE test_func();

Я вставил данные, затем IDE сказал: control reached end of trigger procedure without RETURN Where: PL/pgSQL function test_func()

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Ваша функция триггера просто отсутствует RETURN NEW; оператор:

CREATE OR REPLACE FUNCTION test_func()
RETURNS TRIGGER AS 
$$
DECLARE cnt INTEGER;
BEGIN
    cnt := COUNT(*) FROM sample_tbl WHERE id = NEW.id AND created_date = NEW.created_date;
    NEW.current_order := cnt + 1;
    RETURN NEW;
END 
$$ LANGUAGE plpgsql;
0 голосов
/ 15 января 2019

Ошибка говорит о том, что вы должны вернуть что-то из триггера (либо NEW, либо NULL)

Для этого не требуется триггер. Простой View с помощью этого запроса выбора даст вам требуемый результат

--create or replace view sample_view as
select t.id, t.created_date,
       row_number() OVER ( partition by  id,created_date order by id ) as current_order
FROM sample_tbl t;

Это будет точно соответствовать записям, если они обновлены с использованием триггера

CREATE OR REPLACE FUNCTION test_func()
RETURNS TRIGGER AS 
$$
DECLARE cnt INTEGER;
BEGIN
    select COUNT(*) INTO cnt FROM sample_tbl WHERE id = NEW.id 
      AND created_date = NEW.created_date;
    NEW.current_order := cnt + 1; 
RETURN NEW; --required
END 
$$ LANGUAGE plpgsql;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...