从触发器执行存储过程时出现 Postgres 错误 [42883] 和 [42601]
Postgres error [42883] and [42601] while executing stored procedure from trigger
我想创建一个触发器来执行一个存储过程,该过程将更新几行。当我使用 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);在这一行
您不需要将参数传递给过程,也不需要使用 UPDATE
如果您使用 BEFORE 触发器,您可以简单地分配值。
触发函数也要用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
<b>BEFORE</b> INSERT ON users
FOR EACH ROW
EXECUTE PROCEDURE update_reg_location();
我想创建一个触发器来执行一个存储过程,该过程将更新几行。当我使用 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);在这一行
您不需要将参数传递给过程,也不需要使用 UPDATE
如果您使用 BEFORE 触发器,您可以简单地分配值。
触发函数也要用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
<b>BEFORE</b> INSERT ON users
FOR EACH ROW
EXECUTE PROCEDURE update_reg_location();