Я создал следующий триггер, однако, когда я пытаюсь вставить некоторые данные в таблицу, возникает следующая ошибка: «управление достигло конца триггерной процедуры без RETURN».
Я использую SQL Manager Lite для PostgreSQL версии 5.9.5, я пытался изменить RETURN Null на RETURN NEW, но когда я пытаюсь скомпилировать, возникает та же ошибка.
BEGIN
IF NEW.saida3 IS NOT NULL THEN
UPDATE ponto
SET banco_de_horas = "interval"((saida1 - entrada1) + (saida2 - entrada2) + (saida3 - entrada3) - '08:00:00')
WHERE "time"(entrada1) < '22:00:00' AND "time"(entrada1) > '06:00:00' AND saida3 IS NOT NULL;
RETURN NULL;
ELSE IF NEW.saida2 IS NOT NULL THEN
UPDATE ponto
SET banco_de_horas = "interval"((saida1 - entrada1) + (saida2 - entrada2) - '08:00:00')
WHERE "time"(entrada1) < '22:00:00' AND "time"(entrada1) > '06:00:00' AND saida2 IS NOT NULL;
RETURN NULL;
END IF;
END IF;
END;
Триггер должен рассчитать время компа





Любая функция PostgreSQL должна завершаться оператором RETURN.
Ваш код плохо отформатирован и плохо читается
BEGIN
IF NEW.saida3 IS NOT NULL THEN
UPDATE ponto
SET banco_de_horas = "interval"((saida1 - entrada1)
+ (saida2 - entrada2)
+ (saida3 - entrada3) - '08:00:00')
WHERE "time"(entrada1) < '22:00:00'
AND "time"(entrada1) > '06:00:00'
AND saida3 IS NOT NULL;
RETURN NULL;
ELSE
IF NEW.saida2 IS NOT NULL THEN
UPDATE ponto
SET banco_de_horas = "interval"((saida1 - entrada1)
+ (saida2 - entrada2) - '08:00:00')
WHERE "time"(entrada1) < '22:00:00'
AND "time"(entrada1) > '06:00:00'
AND saida2 IS NOT NULL;
RETURN NULL;
END IF;
END IF; --<<< THIS branch is not closed by RETURN
END;
После переформатирования вы можете увидеть путь, где отсутствует RETURN.
Я не понимаю в вашем случае, поэтому я не могу это исправить, но для этого кода, я так думаю, RETURN null может быть только один как последний оператор триггерной функции.
Спасибо, что пояснили, что функции должны иметь оператор RETURN, и добавление RETURN в конец сработало, спасибо, я буду использовать
RETURN NEW, так как функция вычислит и установит это значение в поле.