ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger

之前曾遇到过这个错误,知道触发器中不能直接和间接的使用动态SQL语句。可是目前我有这么一个问题,:
我创建了一个触发器,当向表tables中插入数据时,调用存储过程B,删除旧记录,添加新纪录。
存储过程B的内容大致如下:
DROP PROCEDURE IF EXISTS GAFIS_ADMIN_ModLog_AddOrUpdate //
CREATE PROCEDURE GAFIS_ADMIN_ModLog_AddOrUpdate(p_tablename VARCHAR(40), p_id DECIMAL)
BEGIN 
  -- 删除原有记录
  SET @V_SQL := CONCAT('DELETE FROM ' , p_tablename , ' WHERE ID=' , p_id);
  PREPARE stmt FROM @V_SQL;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
  
  -- 添加新纪录
  SET @V_SQL := CONCAT('INSERT INTO ' , p_tablename , '( ID,OPTIME) VALUES(' , p_id , ', now())');
  PREPARE stmt FROM @V_SQL;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END;
//

可是,我发现在调用过程中,就会报如上的错误。但是,因为要删除和插入的表明都要从外界传人,所以,我又必须使用这种SQL语句,这就出现了矛盾。我想请问下,针对我的情况,该如何解决这个矛盾呢?

作者: tiantang_85   发布时间: 2011-05-10

在TRIGGER中不能使用,用SP 打开游标->拼接SQL语句->动态执行

作者: wwwwb   发布时间: 2011-05-10

没有办法,这个是MYSQL本身的限制。

只能考虑其它方法来实现,比如程序代码中。

作者: ACMAIN_CHM   发布时间: 2011-05-10