Обновить таблицу в триггере со значениями из хранимой процедуры

Я хотел сделать триггер, который обновляет таблицу со значениями процедуры. Я хочу, чтобы триггер сделал что-то подобное:

DELIMITER $$
CREATE TRIGGER onInsertVillage AFTER INSERT ON Village
FOR EACH ROW
BEGIN
    UPDATE Village V SET V.xCoordinaat = x, V.yCoordinaat = y FROM getVrijePlaatsInMap();
END$$
DELIMITER ;

Но это не работает.. Кстати, процедура возвращает значение x и y. Есть ли способ заставить триггер сделать свою работу?

1 ответ

  1. Я полагаю, что триггер должен адаптироваться xCoordinaatи yCoordinatдля каждой новой деревни вставляется в таблицу Village. Если это так, я бы использовалBEFORE INSERT-trigger, который имеет доступ к значениям соответствующей записи деревни, которая будет вставлена (прежде чем она будет вставлена). В отсутствие схемы и кода хранимой процедуры вашего примера, я написал упрощенную программу, демонстрирующую этот подход:

    create table test (
        a int,
        b int,
        c int
    );
    
    
    CREATE PROCEDURE simpleproc (IN a int, OUT b INT, OUT c int)
    BEGIN
      set b = a div 100;
      set c = a % 100;
    END;
    
    CREATE TRIGGER test_before_insert
    BEFORE INSERT
       ON test FOR EACH ROW
    BEGIN
       call simpleproc (new.a,new.b,new.c);
    END;
    
    insert into test (a,b,c) values (120,0,0), (210,0,0), (303,0,0);
    

    это дает:

      a | b | c
    ----|---|---
    120 | 1 | 20
    210 | 2 | 10
    303 | 3 | 3
    

    Работа с вашим подходом может быть немного сложнее; в триггереAFTER INSERT-у вас есть доступ к.NEW-значениям, но вы не можете их изменить; следовательно, вы должны сделать обновление таблицы, но вы каким-то образом должны определить деревню, которая только что была вставлена.