【问题标题】:How do I set the NEW trigger values using a stored procedure?如何使用存储过程设置新的触发器值?
【发布时间】:2013-04-18 12:25:41
【问题描述】:

如何使用存储过程设置新的触发器值?例如,在插入 myTable 之前,我想将 myTable.someColumn 的新值设置为给定值。尝试这样做时,我在尝试创建过程时收到 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”

编辑。以下将起作用。

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 ;

【问题讨论】:

  • 请告诉我为什么这是一个如此可怕的问题。
  • 我能够通过将 NEW.someColumn 从触发器传递到过程并使用 CREATE PROCEDURE myProc (INOUT myID int) 来使其工作
  • 3 次反对票和 2 次关闭,我显然问错了什么。请告诉我它是什么。

标签: mysql sql stored-procedures triggers


【解决方案1】:

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

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. 我不知道为什么有人认为这不是一个好问题。)

【讨论】:

  • 谢谢玛杰塔。是的,您的解决方案应该有效。此外,我编辑了我的原始帖子并展示了另一种可行的解决方案。显然,我的实际过程比我展示的要长得多,并且我使用了一个过程,因为它用于多个表。我想知道是否每个人都认为这是一个糟糕的问题,因为他们觉得触发器不应该与存储过程一起使用?我猜我们永远不会知道他们是否不发表评论。再次感谢
  • 我不认为你的问题不好。既然我给了你一个有用的答案,我显然能够理解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2013-09-12
  • 2013-01-22
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多