将一个表字段更新到另一个表字段,数据量大使用存储过程不会锁表

将一个表所需数据查出来存到集合变量中,然后循环游标更新另一张表。

-- 取值设置到临时变量中
FETCH ossList INTO oss,cdkey;

DROP PROCEDURE IF EXISTS staff_zt_test;
-- 存储过程
CREATE PROCEDURE staff_zt_test()
BEGIN
    -- 该变量用于标识是否还有数据需遍历
    DECLARE flag INT DEFAULT 0;
    -- 创建一个变量用来存储遍历过程中的值
    DECLARE oss VARCHAR(64);
    DECLARE cdkey VARCHAR(255);
    -- 查询出需要遍历的数据集合
    DECLARE ossList CURSOR FOR (select a.oss,a.cdkey from account a WHERE a.oss is not null);
    -- 查询是否有下一个数据,没有将标识设为1,相当于hasNext
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;
    -- 打开游标
    OPEN ossList;
        -- 取值设置到临时变量中
        FETCH ossList INTO oss,cdkey;
        -- 遍历未结束就一直执行
        WHILE flag != 1 DO
                -- targetSQL //你想要执行的目标功能,这里可以写多个SQL
                
                --   注意
                -- 这里有一个坑,目标语句引用临时变量,实测发现不需要加@符号,但是搜索到的结果都是例如:@id ,这样来使用,实测发现无法取到数据
                --   注意
                update created_player cp set cp.oss =oss where cp.account = cdkey;
                -- 一定要记得把游标向后移一位,这个坑我替各位踩过了,不需要再踩了
                FETCH ossList INTO oss,cdkey;
                -- FETCH cdkeyList INTO cdkey;
        END WHILE;
    CLOSE ossList;
END;
-- 执行存储过程 call staff_zt_test();
源码,是痛苦的,又是快乐的,如果没有这痛苦,也就没有了这快乐!
原文地址:https://www.cnblogs.com/erlongxizhu-03/p/14417249.html