PostgreSQL错误:插入新数据时触发错误

时间:2019-04-25 19:32:10

标签: postgresql plpgsql database-trigger

我创建了以下触发器,但是当我尝试在表中插入一些数据时,会发生以下错误:“控件到达触发器过程的结尾而没有返回”。

我使用的是PostgreSQL 5.9.5版的SQL Manager Lite,我试图将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;

触发是计算补偿时间

1 个答案:

答案 0 :(得分:0)

任何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只能作为触发函数的最后一条语句。