如何忽略触发器中存储过程的结果集?

时间:2016-05-11 09:25:24

标签: mysql

我的问题是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中的触发器中删除结果集?

1 个答案:

答案 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

详细了解INOUTINOUT参数here