我的问题是basically this one,但对于MySQL而不是SQL Server。
我有一个存储过程,它返回一个结果集。
CREATE STORED PROCEDURE CreateFoo (input_id INT)
DECLARE result_id INT;
INSERT INTO FooTable (blah blah) VALUES (blah blah);
SELECT LAST_INSERT_ID() INTO result_id;
INSERT INTO OtherTable (x, y, blah) VALUES (input_id, result_id, blah);
SELECT result_id;
END
我在另一张桌子上有一个触发器
CREATE TRIGGER MyTrigger AFTER INSERT ON Bar
FOR EACH ROW
BEGIN
CALL CreateFoo (NEW.a);
CALL CreateFoo (NEW.b);
END
但是现在当我插入Bar时我得到了
ERROR 1415 (0A000) at line 5365: Not allowed to return a result set from a trigger
我理解为什么会这样,现在我需要静静地忽略CreateFoo
的结果集。
在SQL Server中,答案是创建一个临时表和INSERT INTO Temp CALL CreateFoo
,但显然你无法在MySql中执行此操作。
有没有办法从MySql中的触发器中删除结果集?
答案 0 :(得分:1)
我能想到的唯一方法是使用OUT
参数(这实际上是从过程返回结果的“干净”方式,当它只是一行时)。
重写你的程序:
CREATE STORED PROCEDURE CreateFoo (IN input_id INT, OUT result INT)
INSERT INTO FooTable (blah blah) VALUES (blah blah);
SET result = LAST_INSERT_ID();
END
或
CREATE STORED PROCEDURE CreateFoo (IN input_id INT, OUT result INT)
INSERT INTO FooTable (blah blah) VALUES (blah blah);
SELECT LAST_INSERT_ID() INTO result;
END
您可以执行以下程序:
CALL CreateFoo(5, @my_result);
当您需要最后一个插入ID时,可以将其与
一起使用SELECT @my_result;
在同一会话中。
在你的触发器当然你只是忽略变量。
CREATE TRIGGER MyTrigger AFTER INSERT ON Bar
FOR EACH ROW
BEGIN
CALL CreateFoo (NEW.a, @variable_you_donT_care_about);
CALL CreateFoo (NEW.b, @variable_you_donT_care_about);
END
详细了解IN
,OUT
和INOUT
参数here。