【问题标题】:Syntax error when calling function inside if statement in trigger function在触发函数中的 if 语句中调用函数时出现语法错误
【发布时间】:2018-09-11 08:42:59
【问题描述】:

我正在尝试创建一个触发器函数,它只是在 if 语句中调用一个函数:

CREATE OR REPLACE FUNCTION public."onTrack"()
    RETURNS trigger
    LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
    IF (TG_OP = 'INSERT') THEN
        "updateUserStats"(NEW."userId");
    ELSIF (TG_OP = 'DELETE') THEN
        "updateUserStats"(OLD."userId");
    END IF

    RETURN NULL
END
$BODY$;

但是,当我尝试创建函数时,我得到了这个错误

我不确定我做错了什么,根据文档,这种语法是正确的。删除函数周围的引号将不起作用,因为名称区分大小写并且仍然是语法错误。

我使用的是“PostgreSQL 9.5.14”版本

【问题讨论】:

  • perform updateUserStats(NEW.userId); ?
  • 你也错过了END IFRETURN NULL之后的分号
  • 哦,这似乎行得通。让它成为答案?不敢相信我在阅读文档时错过了这一点。
  • 不相关,但是:你真的应该避免使用带引号的标识符("onTrack""userId"、...),它们带来的麻烦多于值得。
  • 它们以这种方式命名是为了保持一致性。我对它们根本没有任何问题,这取决于 imo 的偏好。

标签: postgresql plpgsql


【解决方案1】:

您似乎缺少perform 关键字:

IF (TG_OP = 'INSERT') THEN
    PERFORM "updateUserStats"(NEW."userId");
ELSIF (TG_OP = 'DELETE') THEN
    PERFORM "updateUserStats"(OLD."userId");
END IF;

【讨论】:

    【解决方案2】:

    你只需要调用那个函数:

    ...
    perform updateUserStats(NEW.userId);
    ...
    

    你也错过了END IFRETURN NULL之后的分号

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多