IT序号网

mysql之声明游标时使用变量

leader 2024年06月20日 编程语言 23 0

我想将参数传递给过程并将其用于声明游标时的表名。以下代码返回错误消息:#1146 - 表 'db.table_id' 不存在。

声明游标时如何使用参数?

谢谢

分隔符;;

如果存在则删除程序 reset_id;;

创建过程 reset_id(table_id VARCHAR(25))
开始
DECLARE done INT DEFAULT FALSE;
声明 id INT;
声明 id_new INT;
DECLARE getid CURSOR FOR SELECT entryId FROM table_id ORDER BY entryId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

设置@id_new = 1;

打开getid;

将 getid 提取到 id 中;
重复
UPDATE table_id SET entryId = @id_new WHERE entryId = id;
设置@id_new = @id_new + 1;
将 getid 提取到 id 中;
直到完成 END REPEAT;
关闭 getid;
结尾
;;

调用 reset_id('Test');

修改过程后,仍然返回错误#1324 - Undefined CURSOR: getid。我该如何解决这个问题?

分隔符;;

如果存在则删除程序 test2;;

创建过程 test2(table_id VARCHAR(25))
开始
DECLARE done INT DEFAULT FALSE;
声明 id INT;
声明 id_new INT;
声明 stmt1 VARCHAR(1024);
声明 stmt2 VARCHAR(1024);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

SET @sqltext1 := CONCAT('DECLARE getid CURSOR FOR SELECT entryId FROM ',table_id,' ORDER BY entryId');
从@sqltext1 准备stmt1;
执行 stmt1;

设置@id_new = 1;

打开getid;

将 getid 提取到 id 中;
重复
SET @sqltext2 := CONCAT('UPDATE ',table_id,' SET entryId = ? WHERE entryId = ?');
从@sqltext2 准备stmt2;
使用@new_id,id执行stmt2;
设置@id_new = @id_new + 1;
将 getid 提取到 id 中;
直到完成 END REPEAT;
关闭 getid;
结尾
;;

调用 test2('测试');

请您参考如下方法:

表名必须在 SQL 文本中指定;它不能是变量。

要完成您要执行的操作,您将需要动态创建一个包含您要执行的 SQL 文本的字符串。

从任意字符串准备语句:

SET @sqltext := CONCAT('UPDATE ',table_id,' SET entryId = ? WHERE entryId = ?'); 
PREPARE stmt FROM @sqltext; 

请注意 table_id值被合并到一个字符串变量中,然后 PREPARE语句(本质上)将该字符串转换为实际的 SQL 语句。

要执行准备好的语句并为绑定(bind)变量提供值,您需要执行以下操作:
EXECUTE stmt USING @new_id, @id; 

您可以多次重新执行准备好的语句,而无需再次准备。因此,PREPARE 将在您的循环之前完成,EXECUTE 可以在循环内完成。

完成语句后,按照循环,最佳做法是像这样解除分配语句:
DEALLOCATE PREPARE stmt; 

注意:

表名不是变量的限制实际上适用于 SQL 语句中的所有标识符,包括表名、 View 名、列名、函数名等。这些都必须是 SQL 文本中的文字,就像保留关键字一样.


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!