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