MySql创建存储过程(procedure)

如果存储过程中含有动态SQL语句,在触发器中调用该存储过程时会报错ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger。

该错误的含义是:函数或者触发器不支持动态SQL语句。下面详细介绍这个错误的重现过程,并提出解决方案。

1.建表

   建立人员信息表,包含id和name两列。

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");

Comment

华计科技: 中华自主研发设计

华计科技为您提供咨询服务,IT技术支持和项目开发: (+86) 156 2654 0671

联系我们