Postgres ошибка [42883] и [42601] при выполнении хранимой процедуры из триггера - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу создать триггер, который будет выполнять процедуру сохранения, которая обновит несколько строк. Процедура работает, когда я тестирую ее с использованием метода 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); в этой строке

1 Ответ

1 голос
/ 16 апреля 2020

Вам не нужно передавать параметры в процедуру, и вам не нужно использовать UPDATE, если вы используете ПЕРЕД триггером, вы можете просто присвоить значения.

Функции триггера также должны используйте PL / pg SQL, вы не можете записать их в 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();
...