如何使用存储过程设置NEW触发器值?

时间:2013-04-18 12:25:42

标签: mysql sql stored-procedures triggers

如何使用存储过程设置NEW触发器值?例如,BEFORE INSERT on myTable,我想将myTable.someColumn的NEW值设置为给定值。尝试这样做时,尝试创建过程时出现1193错误。谢谢

DELIMITER $$

CREATE PROCEDURE `myProc` ()
BEGIN
    //How do I set NEW.someColumn of myTable?
    SET NEW.someColumn=123;
END$$

CREATE TRIGGER myTrig BEFORE INSERT ON myTable FOR EACH ROW
BEGIN
    //SET NEW.someColumn=123; //This works, but I want to do the setting within the stored procedure
    CALL myProc();
END$$

DELIMITER ;

INSERT INTO myTable(id,data) VALUES (1,"hello");
//Above "should" really do INSERT INTO myTable(id,data,someColumn) VALUES (1,"hello",123);
  

1193 - 未知的系统变量'someColumn'

EDIT。以下将有效。

DELIMITER $$

CREATE PROCEDURE `myProc` (INOUT myID int)
BEGIN
    SET myID =123;
END$$

CREATE TRIGGER myTrig BEFORE INSERT ON myTable FOR EACH ROW
BEGIN
    CALL myProc(NEW.someColumn);
END$$

DELIMITER ;

1 个答案:

答案 0 :(得分:4)

你不能完全按照你开始的方式去做。但是你可以通过让存储过程只给你一个值来实现你想要的东西,然后在触发器中使用这个值:

delimiter //

CREATE PROCEDURE myProc (OUT param1 INT)
 BEGIN
   SET @value = 123;
 END//

delimiter ;

然后你可以让你的触发器调用存储过程并使用它的值:

CREATE TRIGGER myTrig BEFORE INSERT ON myTable FOR EACH ROW
 BEGIN
    CALL myProc(@columnValue);
    SET NEW.someColumn = @columnValue;
END$$

我没有测试过,只是直接打字。如果它不起作用,请告诉我,我会修改我的答案。

另外,请告诉我,如果这不是你想要的,或者不够完整,我会修改我的答案。

(p.s。我不知道为什么有人认为这不是一个好问题。)