如果存储过程中含有动态SQL语句,在触发器中调用该存储过程时会报错ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger。
该错误的含义是:函数或者触发器不支持动态SQL语句。下面详细介绍这个错误的重现过程,并提出解决方案。
1.建表
建立人员信息表,包含id和name两列。
CREATE TABLE person (
id int,
name varchar(20)
);
2.建存储过程
表名作为参数传入,创建一张新表,作为person表的日志。
DELIMITER $$
CREATE PROCEDURE personLog(IN table_name VARCHAR(20))
BEGIN
SET @name = table_name;
SET @str = CONCAT('create table ', @name,'(id int, name varchar(20))');
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
3.建触发器
当person表中插入数据时,调用存储过程。
DELIMITER $$
CREATE TRIGGER person_trigger after insert on person FOR EACH ROW
BEGIN
call personLog(new.name);
END $$
DELIMITER ;
4.插入数据
insert into person VALUES(1,'April') ;
插入数据时,触发器自动启动并调用存储过程,此时报错:ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger,即函数或者触发器不支持动态SQL语句。
为了避免该问题,我们可以采用直接调用存储过程的方法。
mysql>call personLog("April");