sql错误>>存储函数或触发器中不允许使用动态SQL [英] sql Error>> Dynamic SQL is not allowed in stored function or trigger

查看:582
本文介绍了sql错误>>存储函数或触发器中不允许使用动态SQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

DELIMITER //
CREATE TRIGGER `test11` BEFORE UPDATE ON batch FOR EACH ROW
BEGIN
  DECLARE proud Double;
  DECLARE result_position int;
  DECLARE result_all int;

  DECLARE date1 date;
  DECLARE cust varchar(100);
  SET @result_position = 1;   
 
  DELETE FROM temp;
  SELECT COUNT(Batch_Date) INTO @result_all FROM batch WHERE Batch_date BETWEEN DATE_SUB(NOW(), INTERVAL 25 DAY) AND NOW() ;
         
  lab: LOOP
    PREPARE STMT FROM 'SELECT Batch_Date,Customer_Code,Production_Qty INTO @date1,@cust,@proud FROM batch WHERE Batch_date BETWEEN DATE_SUB(NOW(), INTERVAL 25 DAY) AND NOW() LIMIT ? , 1' ;
    EXECUTE STMT USING @result_position ;

    INSERT INTO temp (Batch_Date,Customer_Code,Production_Qty) VALUES(@date1,@cust,@proud);
    SET @result_position = @result_position + 1;

    if @result_position  > @result_all then
     LEAVE  lab;
    end if;
  END LOOP;

  END
  //

DELIMITER ;

推荐答案

Hello Vishal,



当前MySQL(5.7)手册部分 D.1对存储程序的限制声明

Hello Vishal,

The Current MySQL (5.7) Manual section D.1 Restrictions on Stored Programs states that


  1. SQL预处理语句(PREPARE,EXECUTE,DEALLOCATE PREPARE)可用于存储过程,但不能用于存储的函数或触发器。因此,存储的函数和触发器不能使用动态SQL(将语句构造为字符串然后执行它们)。
  2. 通常,SQL预处理语句中不允许的语句也不允许存储的程序。有关作为预准备语句支持的语句列表。
  3. 由于局部变量仅在存储程序执行期间在范围内,因此在存储程序中创建的预准备语句中不允许引用它们。准备好的语句范围是当前会话,而不是存储的程序,因此语句可以在程序结束后执行,此时变量将不再在范围内。



所以你可以看到它是不允许的。



问候,


So you can see that it''s not permitted.

Regards,


这篇关于sql错误>>存储函数或触发器中不允许使用动态SQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆