2017-04-27 140 views
1

我在mysql上創建觸發器時發生異常,粘貼下面的觸發器片段。我希望在這個觸發器中的prepare語句拋出這個異常,請糾正我語法中的任何錯誤。在存儲函數或觸發器問題中​​,不允許動態SQL,但在mysql上創建觸發器時

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` TRIGGER mysql_common.mysql_alert_trigger after insert on mysql_common.alert FOR EACH ROW 

BEGIN 

set @col_string = "col1,col2,col3"; 
set @val_string = "('val1','val2','val3')"; 

SET @s := CONCAT('INSERT into msql_common.seperated_processlist(',@col_string,') values ', @val_string); 
PREPARE dynamic_statement FROM @s; 
EXECUTE dynamic_statement; 
DEALLOCATE PREPARE dynamic_statement; 

END $$ 
DELIMITER ; 
+0

你想在這個觸發器中完成什麼?你爲什麼要構造一個動態的SQL語句? (這是非常不尋常的和冒險的!) – duskwuff

+0

我需要這個觸發器來處理應用程序數據。 –

+0

這實際上並不能解釋你想要做什麼。你能舉一個更具代表性的例子嗎? (當然,觸發器在每次激活時都不插入相同的數據...) – duskwuff

回答

0
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` TRIGGER mysql_common.mysql_alert_trigger after insert on mysql_common.alert FOR EACH ROWEACH ROW 

BEGIN 

call SOME_PROC(); 
END $$ 
DELIMITER ; 

你可以寫一個程序與您的業務邏輯,並呼籲從觸發這一程序,如上面的code.with特定的輸入和輸出參數。

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `SOME_PROC`() 
BEGIN 
    set @col_string = "col1,col2,col3"; 
set @val_string = "('val1','val2','val3')"; 

SET @s := CONCAT('INSERT into msql_common.seperated_processlist(',@col_string,') values ', @val_string); 
PREPARE dynamic_statement FROM @s; 
EXECUTE dynamic_statement; 
DEALLOCATE PREPARE dynamic_statement; 

END$$ 
DELIMITER ; 

希望這會有所幫助。

+0

感謝您的建議 –

+0

@AshokSri是否解決了您的問題? –

+2

雖然您可以在存儲過程中創建預準備語句,但在觸發器的上下文中,您無法調用執行預準備語句的存儲過程,但會拋出問題中指示的錯誤。 – wchiquito