MySql创建存储过程(procedure)

本文详细介绍了在MySQL中使用动态SQL语句在触发器中调用存储过程时遇到的ERROR1336错误,通过实例演示了错误的重现过程,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    如果存储过程中含有动态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");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值