mysql - 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 //
如果我直接使用该语句,它工作正常。
解决方案
这是一件奇怪的事情,但此时您需要使用用户定义的变量:
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 //
该手册指出:
在存储程序上下文中准备的语句不能引用存储过程或函数参数或局部变量,因为它们在程序结束时超出范围,并且如果稍后在程序之外执行该语句,它们将不可用。作为一种解决方法,请改为参考用户定义的变量,这些变量也具有会话范围
推荐阅读
- javascript - 单击视口中可见的按钮
- python - Python 中 f.seek() 的复杂性
- python - 如果满足 2 个条件,则将所有 numpy 数组值设置为 x
- postgresql - Kubernetes卷权限错误上的postgres
- regex - 使用 RegEx 删除负字符串
- github - 如何在 API 触发的 repo 导入 GitLab 中包含 GitHub 问题和 PR?
- google-api - 使用 oAuth2 的 Analytics 报告 API 身份验证响应“并非所有范围都已批准”。
- c - 字符表,分段错误
- android - 我不能在 onClick() 中使用 setText()
- c# - 如何将字符串和 int 都发送到 ICommand?