mysql - 从触发器调用包含动态 SQL 的存储过程

标签 mysql stored-procedures triggers dynamic-sql

我正在从 Trigger 调用存储过程,但出现以下错误:

Dynamic SQL is not allowed in stored function or trigger

为什么会这样,动态SQL是在Stored procedure中执行的,是Trigger调用的。也许这就是问题所在,如果是,是否有任何解决方法?

编辑(添加代码):

这是来自主表的触发器:

-- Trigger DDL Statements
DELIMITER $$

USE `TestaDataBase`$$
CREATE TRIGGER `TestaDataBase`.`UpdateAuxilaryTable`
AFTER INSERT ON `MainTable` FOR EACH ROW  
BEGIN    
    /* Here we call stored procedure with parameter id of newly inserted row. */
    CALL TestProcedure('Year', 'Person', 'IdPerson', NEW.IdData);
END
$$

这是从触发器调用的存储过程:

DELIMITER $$
CREATE PROCEDURE `TestDataBase`.`TestProcedure` (IN attribute CHAR(64), IN tableName CHAR(64), IN IdTable CHAR(64), IN IdLastRow MEDIUMINT)
BEGIN
DECLARE selectedValue MEDIUMINT;

SET @statement = CONCAT('SELECT ', attribute, ' FROM ', tableName, ' WHERE ', IdTable, ' = ', IdLastRow, ' INTO selectedValue');
PREPARE statementExecute FROM @statement;
EXECUTE statementExecute ;
...
...
END

最佳答案

您不能使用触发器中的准备好的语句调用存储过程

http://dev.mysql.com/doc/mysql-reslimits-excerpt/5.1/en/stored-program-restrictions.html

有一个可能的解决方法,但需要您编写一个 UDF 来为您执行动态 sql,然后从您的过程中调用 UDF。您可以在 mysql 的源文件 sql/udf_example.c 中找到示例 UDF。

关于mysql - 从触发器调用包含动态 SQL 的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11454699/

相关文章:

php - MySQL/PHP 忽略现有用户(有时)

mysql - 将月初至今与上个月同期 MySQL 进行比较

.net - 无法使用ADO.NET Entity Framework 执行存储过程

mysql - 插入子表时触发将值插入父表

javascript - 用于闪烁一系列单元格的 Google 电子表格脚本

PostgreSQL 慢 COUNT() - 触发器是唯一的解决方案吗?

mysql - 无法找到mysql存储过程代码中的错误

php - foreach 内部的 foreach 只显示一个结果

mysql - 存储过程中的更新和插入操作

postgresql函数返回不同的表结构