2016-05-11 78 views
1

我的問題是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 

但現在當我插入到酒吧我得到

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

我能想到的唯一方法是使用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

+0

那麼在PDO層面,它會是這樣嗎? '$ q = $ db-> prepare(「CALL CreateFoo(?,@ tmp)」); bind_and_execute($ Q); $ q = $ db-> prepare(「SELECT @tmp」);'? – spraff

+0

我不是程序員,對不起:)試試吧。 – fancyPants

+0

@spraff:請參見[準備語句和存儲過程:示例4使用輸出參數調用存儲過程](https://secure.php.net/manual/en/pdo.prepared-statements.php#example-1009 )。 – eggyal