首页 > 解决方案 > PostgreSQL ERROR:插入新数据时触发错误

问题描述

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

我正在使用 SQL Manager Lite for 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;

触发器是计算补偿时间

标签: postgresqlplpgsqldatabase-trigger

解决方案


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


推荐阅读