【问题标题】:Postgres error [42883] and [42601] while executing stored procedure from trigger从触发器执行存储过程时出现 Postgres 错误 [42883] 和 [42601]
【发布时间】:2020-04-16 20:26:56
【问题描述】:

我想创建一个触发器,该触发器将执行一个存储过程,该过程将更新几行。当我使用 Call 方法对其进行测试时,程序可以工作,但触发器无法找到它,错误是函数不存在。 这是我的程序

create or replace PROCEDURE update_reg_location(latitude text, longitude text,userid int)
LANGUAGE SQL
AS $$
update users set reg_lat=latitude , reg_lon=longitude where id =userid
$$;

当我使用时

call update_reg_location('123','234',1)

从 IDE 中它工作正常并且记录已更新,但是当我在触发器中使用它时它不会编译。

CREATE TRIGGER update_reg_location
    after INSERT ON users
    FOR EACH ROW
    EXECUTE PROCEDURE update_reg_location('123','234',1);

当我想像这样获取插入行的新值时也会出错

CREATE TRIGGER update_reg_location
    after INSERT ON users
    FOR EACH ROW
    EXECUTE PROCEDURE update_reg_location(new.lat,new.lon,1);

得到错误为 在新处或附近出现语法错误。 (new.lat,new.lon,1);在这一行

【问题讨论】:

    标签: postgresql stored-procedures database-trigger


    【解决方案1】:

    如果你使用 BEFORE 触发器,你不需要向过程传递参数,也不需要使用UPDATE,你可以简单地赋值。

    触发函数也需要使用PL/pgSQL,不能用SQL写。

    create or replace function update_reg_location()
      returns trigger
    LANGUAGE plpgsql
    AS $$
    begin
      new.reg_lat = new.lat;
      new.reg_lon = new.lon;
      return new;
    end;
    $$;
    

    然后定义一个BEFORE触发器:

    CREATE TRIGGER update_reg_location
        BEFORE INSERT ON users
        FOR EACH ROW
        EXECUTE PROCEDURE update_reg_location();

    【讨论】:

    • 出现新错误。 SQL错误[42P13]必须指定函数结果类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多