【问题标题】:Convert oracle for loop to mysql loop将oracle for循环转换为mysql循环
【发布时间】:2015-12-20 16:48:35
【问题描述】:

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

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;
/

上面是oracle代码。 我已经尝试过如下

  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 中出现不正确的语法。子查询返回 2 列。

【问题讨论】:

    标签: mysql oracle stored-procedures


    【解决方案1】:

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

    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'
    

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

    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 ;
    

    【讨论】:

    • 感谢您的快速回复,我会检查并更新您。
    猜你喜欢
    • 2015-12-03
    • 2021-03-12
    • 2018-02-22
    • 2017-04-26
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多