Mysql触发器在循环之前声明

时间:2016-08-10 11:33:21

标签: mysql triggers phpmyadmin

好吧,伙计们,我在任何地方都找不到,但也许我只是不知道该怎么看。我正在使用一个触发器来为每一行调用一个过程,但我想在FOR EACH ROW之前插入一些DECLARE语句。原因是我想在LOOP之前(对于每一行)声明一些东西,所以我不会为我的每一行一遍又一遍地声明同样的事情。

任何人都知道该怎么做?它甚至可能吗?

这是我的触发器的样子:

delimiter $$
CREATE TRIGGER tr_inscricao_insert
  AFTER INSERT ON tbl_inscricao

    DECLARE ra_current INT;
    DECLARE done INT DEFAULT FALSE;

FOR EACH row
BEGIN
    CALL pr_atualizar_creditos(new.ra);
END$$
delimiter ;

2 个答案:

答案 0 :(得分:0)

您可以添加另一个图层,并从包含声明部分的存储过程调用存储过程,并从触发器调用。 看一下这个帖子的灵感: Calling a Stored Procedure in a Stored Procedure in MySQL

答案 1 :(得分:0)

MySQL没有必要的语句级触发器以标准方式实现这一点,但是我创建了以下解决方法。在before触发器中,在第一行之前,它检查ROW_COUNT是否为-1,这意味着尚未插入任何行,并将默认值1设置为@x。然后@x可以在更新后使用。在before触发器中,在第二行之前,当它检查ROW_COUNT时它现在为1或更高,如果你的后触发器插入更多行,无论哪种方式它都不再为-1所以初始化不会再次运行。

DROP TRIGGER record_before_update;
DELIMITER $$
CREATE TRIGGER record_before_update 
    BEFORE UPDATE ON record
    FOR EACH ROW 
BEGIN
    DECLARE y INT;
    SET y = (SELECT ROW_COUNT());
    IF y = -1 THEN 
        SET @x = 1;
    END IF;
END$$
DELIMITER ;

DROP TRIGGER record_after_update;
DELIMITER $$
CREATE TRIGGER record_after_update 
    AFTER UPDATE ON record
    FOR EACH ROW 
BEGIN
    #use @x in something
END$$
DELIMITER ;

请注意,在您的事务中,需要在任何其他更新之前调用使用触发器的语句,否则ROW_COUNT将不会为-1。这个例子是为了更新,你需要为插入触发器做同样的事情。

如果它有助于查看一个真实的例子,这就是我如何使用它。如果对不同的"区域"中的一堆行进行更新,它只会通过维护已更新的区域数组来更新单个区域。

DROP TRIGGER record_before_update;
DELIMITER $$
CREATE TRIGGER record_before_update 
    BEFORE UPDATE ON record
    FOR EACH ROW 
BEGIN
    DECLARE y INT;
    SET y = (SELECT ROW_COUNT());
    IF y = -1 THEN 
        SET @x = NULL;
    END IF;
END$$
DELIMITER ;

DROP TRIGGER record_after_update;
DELIMITER $$
CREATE TRIGGER record_after_update 
    AFTER UPDATE ON record
    FOR EACH ROW 
BEGIN
    DELETE FROM record_change where record_id = NEW.id;
    INSERT INTO record_change(record_id, number) VALUES(NEW.id, @x);
    IF @x IS NULL OR FIND_IN_SET(NEW.zone_id, @x) = 0 THEN
      SET @x = CONCAT_WS(',', @x, NEW.zone_id);
        DELETE FROM zone_change where zone_id = NEW.zone_id;
        INSERT INTO zone_change(zone_id, number) VALUES(NEW.zone_id, @x);       
    END IF;

END$$
DELIMITER ;