之前曾遇到过这个错误,知道触发器中不能直接和间接的使用动态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语句,这就出现了矛盾。我想请问下,针对我的情况,该如何解决这个矛盾呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货