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语句,这就出现了矛盾。我想请问下,针对我的情况,该如何解决这个矛盾呢?
我创建了一个触发器,当向表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