首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将oracle for循环转换为mysql循环

将oracle for循环转换为mysql循环
EN

Stack Overflow用户
提问于 2015-09-23 11:28:40
回答 1查看 650关注 0票数 1

我正在将oracle数据库迁移到mysql。当子查询获取多个记录时,我面临更新perticular表列的问题。

代码语言:javascript
复制
DECLARE

BEGIN
    FOR TENORTYPE in (select gto.string_value, gtl.rowid from gtp_template_objectdata gto, gtp_template_lc gtl
                      where gto.template_id=gtl.template_id and gto.company_id = gtl.company_id and gto.name='tenor_type')
    LOOP
        update gtp_template_lc set tenor_type = TENORTYPE.string_value where rowid = TENORTYPE.rowid;
    END LOOP;
    COMMIT;
END;
/

上面是甲骨文代码。我试过如下所示

代码语言:javascript
复制
  DELIMITER //
 CREATE PROCEDURE do_loop(i VARCHAR)
 BEGIN
       SET i=1; 
   loop_loop: LOOP
   FOR TENORTYPE in (select gto.string_value,@rowid:=@rowid+1 as rowid from gtp_template_objectdata gto, gtp_template_lc gtl
                      where gto.template_id=gtl.template_id and gto.company_id = gtl.company_id and gto.name='tenor_type');

     IF i <= select count(gto.string_value) from gtp_template_objectdata gto, gtp_template_lc gtl
                      where gto.template_id=gtl.template_id and gto.company_id = gtl.company_id and gto.name='tenor_type' 
    THEN
            update gtp_template_lc set tenor_type = TENORTYPE.string_value where rowid = TENORTYPE.rowid;
            SET i=i+1
    ITERATE loop_loop;
     END IF;
     LEAVE loop_loop;
   END LOOP loop_loop;
 END//
  DELIMITER ;

但在mysql中得到不正确的语法。Subquery返回2列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 12:44:14

可以使用多表UPDATE语法使用单个DML语句执行此操作:

代码语言:javascript
复制
UPDATE gtp_template_lc gtl
  JOIN gtp_template_objectdata gto USING (template_id, company_id)
SET    gtl.tenor_type = gto.string_value
WHERE  gto.name = 'tenor_type'

要在过程循环中执行相同的操作,需要一个游标:

代码语言:javascript
复制
DELIMITER //
CREATE PROCEDURE do_loop() BEGIN

  DECLARE cur CURSOR FOR
    SELECT gto.string_value, gtl.rowid
    FROM   gtp_template_objectdata gto
      JOIN gtp_template_lc gtl USING (template_id, company_id)
    WHERE  gto.name='tenor_type';

  DECLARE _string_value VARCHAR(255), _rowid INT;
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;
  updateLoop: LOOP

    FETCH cur INTO _string_value, _rowid;

    IF done THEN
      LEAVE updateLoop;
    END IF;

    UPDATE gtp_template_lc
    SET    tenor_type = _string_value
    WHERE  rowid = _rowid;

  END LOOP updateLoop;
  CLOSE cur;

END//
DELIMITER ;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32738374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档