【问题标题】:Calling stored procedure that contains dynamic SQL from Trigger从触发器调用包含动态 SQL 的存储过程
【发布时间】:2012-07-12 08:56:13
【问题描述】:

我从触发器调用存储过程,我收到以下错误:

存储函数或触发器中不允许使用动态 SQL

为什么会这样,动态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

【问题讨论】:

  • 我已经添加了代码。我希望现在更清楚了。
  • 我也遇到了同样的问题,你找到解决办法了吗?
  • @zidarsk8:不,我还没有找到任何解决方案。我使用的是普通 SQL,这意味着还有更多工作。

标签: mysql stored-procedures triggers dynamic-sql


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2015-05-28
    • 2015-04-01
    • 2016-07-22
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多