sql错误>>存储函数或触发器中不允许使用动态SQL [英] sql Error>> Dynamic SQL is not allowed in stored function or trigger
本文介绍了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
- SQL预处理语句(PREPARE,EXECUTE,DEALLOCATE PREPARE)可用于存储过程,但不能用于存储的函数或触发器。因此,存储的函数和触发器不能使用动态SQL(将语句构造为字符串然后执行它们)。
- 通常,SQL预处理语句中不允许的语句也不允许存储的程序。有关作为预准备语句支持的语句列表。
- 由于局部变量仅在存储程序执行期间在范围内,因此在存储程序中创建的预准备语句中不允许引用它们。准备好的语句范围是当前会话,而不是存储的程序,因此语句可以在程序结束后执行,此时变量将不再在范围内。
所以你可以看到它是不允许的。
问候,
So you can see that it''s not permitted.
Regards,
这篇关于sql错误>>存储函数或触发器中不允许使用动态SQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文