gpt4 book ai didi

mysql - 声明游标时使用变量

转载 作者:行者123 更新时间:2023-12-02 03:38:35 24 4
gpt4 key购买 nike

我想将参数传递给过程并将其用于声明游标时的表名。以下代码返回错误消息:#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 文本中的文字,就像保留关键字一样.

关于mysql - 声明游标时使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21651088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com