【问题标题】:Update table in a trigger with values from stored procedure使用存储过程中的值更新触发器中的表
【发布时间】:2017-01-12 22:57:51
【问题描述】:

我想创建一个触发器,用过程的值更新表。我希望触发器执行以下操作:

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 值。有没有办法让触发器发挥作用?

【问题讨论】:

    标签: mysql sql stored-procedures triggers


    【解决方案1】:

    我想触发器应该适应xCoordinaatyCoordinat插入到表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-值,但不能修改它们;因此,您必须对表格进行更新,但您必须以某种方式识别刚刚插入的村庄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多