gpt4 book ai didi

mysql - 循环表并调用存储过程

转载 作者:行者123 更新时间:2023-11-30 22:25:17 24 4
gpt4 key购买 nike

现在,我正在尝试遍历导入过程创建的临时表。我试过使用游标,但必须将表名传递给存储过程。

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

注意:一天中将多次调用此导入脚本,并且可以同时运行。所以定义的表名不是一个选项。

到目前为止我尝试了什么:

  1. 用给定的表名创建游标。 --> 可以,但名称必须是动态的。
  2. 使用动态 sql 创建游标。 --> 失败
  3. 跳过使用游标并以不同的方式遍历表格。 --> 没有找到使用动态sql的方法

那么,有没有办法通过游标或解决方法来实现这一点?

最佳答案

创建一个临时表并插入我的动态查询的结果最终达到了目的。这样我就可以将 mysql 游标与静态命名的临时表一起使用。由于它是一个临时表,多个导入作业不会相互干扰,因为它们对其他 session 是隐藏的。

最后这是对我有用的代码:

CREATE PROCEDURE `do_update`(IN 

tablename VARCHAR(100))
BEGIN

DECLARE done INT;

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 NVARCHAR(3000);
DECLARE import_cursor CURSOR FOR SELECT ean, sku, mpn, manufacturerName, manufacturerUniqueId, images FROM importjob;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

DROP TEMPORARY TABLE IF EXISTS importjob;

SET @sqlstatement = CONCAT('CREATE TEMPORARY TABLE importjob SELECT ean, sku, mpn, manufacturerName, manufacturerUniqueId, images FROM ', tablename);
PREPARE stmt FROM @sqlstatement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @DEBUG = true;

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 importloop;
CLOSE import_cursor;

DROP TEMPORARY TABLE IF EXISTS importjob;
END

关于mysql - 循环表并调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434825/

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