Функция триггера IF-ELSE Postgres - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть следующий триггер:

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$
BEGIN
    IF (select number_itens from grup where NEW.gruop_id = group_id) != 0 THEN
    UPDATE gruop SET number_itens= (number_itens-1) WHERE gruop_id=NEW.gruop_id;
   END IF;
RETURN NEW;
END; $$
LANGUAGE plpgsql;

CREATE TRIGGER deleted_item
BEFORE DELETE ON item
FOR EACH ROW EXECUTE PROCEDURE record_deleted_item();

В моем предложении if-else я должен проверить, не равно ли значение столбца number_items из таблицы групп 0. Как я могу это проверить? То, как я это сделал, возвращает мне ошибку.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Я не думаю, что вам вообще нужно условие Если в grup нет ничего, что соответствует NEW.gruop_id = group_id, тогда как ОБНОВЛЕНИЕ просто ничего не будет делать, поэтому нет необходимости в двух запросах:

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$
BEGIN
    UPDATE gruop SET number_itens = (number_itens - 1) WHERE gruop_id = NEW.gruop_id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Выше предполагается, что grup это просто опечатка, и у вас есть только gruop таблица.

Кроме того, если это действительно триггер DELETE, вам нужно работать с OLD вместо NEW:

CREATE OR REPLACE FUNCTION record_deleted_item() RETURNS TRIGGER AS $$
BEGIN
    UPDATE gruop SET number_itens = (number_itens - 1) WHERE gruop_id = OLD.gruop_id;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;
0 голосов
/ 14 декабря 2011

SELECT это в переменную и сравнить с нулем. Вы также можете проверить, действительно ли SELECT что-то вернуло.

DECLARE
    ni bigint;
BEGIN
    SELECT number_itens INTO ni FROM ...;
    IF NOT FOUND THEN
    END IF;
    IF NI != 0 THEN
    END IF;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...