【发布时间】:2016-05-27 20:46:55
【问题描述】:
现在,我正在尝试遍历导入过程创建的临时表。我尝试过使用游标,但必须将表名传递给存储过程。
CREATE PROCEDURE `do_update`(tablename VARCHAR(100))
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE c_ean VARCHAR(20);
DECLARE c_sku VARCHAR(20);
DECLARE c_mpn VARCHAR(20);
DECLARE c_manufacturerName VARCHAR(100);
DECLARE c_manufacturerUniqueId VARCHAR(100);
DECLARE c_images TEXT;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
-- move declare cursor into sql to be executed
SET @sqlstatement = CONCAT('DECLARE import_cursor CURSOR FOR SELECT ean, sku, mpn, manufacturerName, manufacturerUniqueId, images FROM ', tablename);
PREPARE stmt FROM @sqlstatement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
OPEN import_cursor;
importloop: LOOP
FETCH import_cursor INTO c_ean, c_sku, c_mpn, c_manufacturerName, c_manufacturerUniqueId, c_images;
IF done THEN
LEAVE importloop;
END IF;
CALL upsert_article(c_ean, c_sku, c_mpn, c_manufacturerName, c_manufacturerUniqueId, c_images);
END LOOP testloop;
CLOSE import_cursor;
END
注意:此导入脚本将在一天内多次调用,并且可以同时运行。所以定义的表名不是一个选项。
到目前为止我所尝试的:
- 使用给定的表名创建游标。 --> 有效,但名称必须是动态的。
- 使用动态 sql 创建游标。 --> 失败
- 使用游标跳过并以不同的方式循环遍历表。 --> 没有找到使用动态sql的方法
那么,有没有办法使用光标或变通方法来完成这项工作?
【问题讨论】:
标签: mysql loops stored-procedures cursor