我正在将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列。
答案 0 :(得分:2)
您可以使用多表UPDATE
语法,使用单个DML语句执行此操作:
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 ;