首页 > 解决方案 > MySQL:在过程中准备/执行(concat)

问题描述

我有点迷路了,我希望能得到你的帮助。我目前正在学习使用 Mysql,我得到了这个过程:

delimiter //
drop procedure price_update2 //
create procedure price_update2()
BEGIN
DECLARE n INT default 0;
DECLARE i INT default 1;
DECLARE cond varchar(255) default '';

SET cond = CONCAT('SELECT customer_id FROM customers LIMIT ',i,',1');
prepare stt FROM cond;
execute stt;
END //

出于某种原因,我总是在“条件;执行 stt ....”附近出现错误。可能这只是一件容易的事,但我找不到。也试过没有连接:

delimiter //
drop procedure price_update2 //
create procedure price_update2()
BEGIN
DECLARE n INT default 0;
DECLARE i INT default 1;
DECLARE cond varchar(255) default '';

SET cond = 'SELECT customer_id FROM customers LIMIT 1';
prepare stt FROM cond;
execute stt;
END //

如果我直接使用该语句,它工作正常。

标签: mysqlprepared-statement

解决方案


这是一件奇怪的事情,但此时您需要使用用户定义的变量

delimiter //
drop procedure price_update2 //
create procedure price_update2()
BEGIN
DECLARE n INT default 0;
DECLARE i INT default 1;

SET @cond = CONCAT('SELECT customer_id FROM customers LIMIT ',i,',1');
prepare stt FROM @cond;
execute stt;
DEALLOCATE PREPARE stt; # don't forget to deallocate
END //

手册指出:

在存储程序上下文中准备的语句不能引用存储过程或函数参数或局部变量,因为它们在程序结束时超出范围,并且如果稍后在程序之外执行该语句,它们将不可用。作为一种解决方法,请改为参考用户定义的变量,这些变量也具有会话范围


推荐阅读