#检查是否有重复名称
DROP PROCEDURE IF EXISTS credit;
#创建存储过程
CREATE PROCEDURE credit()
#开始
BEGIN

        #声明变量 tmpname 作为WHILE 判断条件给定一个初始值,当不是这个初始值条件的时候WHILE循环结束
        DECLARE tmpname varchar(20) default ''; 

        #需要用到变量
        DECLARE Ctotal INT; 

        #需要用到变量
        DECLARE CopenId VARCHAR(30);

        #需要用到变量 list 作为存储查询结果变量
        DECLARE list CURSOR FOR SELECT openId ,total FROM sys_univ_credit;

        #DECLARE CONTINUE HANDLER FOR 它的含义是:若没有数据返回,程序继续,并将变量IS_FOUND设为0 
        #也可以这么写 DECLARE CONTINUE HANDLER FOR NOT FOUND SET tmpname = null;
        #变量 tmpname  02000 主要代表的意思可以理解为:
        #发生下述异常之一:SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。
        #在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。
        #在 FETCH 语句中引用的游标位置处于结果表最后一行之后。
        #就是说你定义了,当fetch游标到了数据库表格最后一行的时候,设置tmpname=null.
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;
    OPEN list;
            #将游标向下移1行,获取的数据放入之前定义的变量CopenId,Ctotal中
            #第一次只是用来判断  tmpname is not null 
            #后面一次 “FETCH NEXT FROM ” 才是循环用到的 也就是后面一次 是在 WHILE中,是被反复执行的。。每次读取一行
            #将list中的openId,total赋值给CopenId, Ctotal
            FETCH NEXT FROM list INTO CopenId, Ctotal;
                #不到最后一行 不会触发 tmpname = null
                WHILE (tmpname is not null) DO
                    #需要执行的SQL
                    INSERT INTO sys_coin (openId, total, type, status, createTime)VALUES(CopenId,Ctotal,2,1,NOW());
                    #NEXT 是 FETCH 的默认选项.不写也行,直接写 FETCH FROM
                    FETCH NEXT FROM list INTO CopenId, Ctotal;
                END WHILE;
        #关闭游标
        CLOSE list;
END;
#执行函数
call credit();

上述存储过程可以使用解决,注意:now()时间使用的是数据库时间!
 

insert into sys_coin(openId, total, type, status, createTime) select openId ,total,2,1,now() FROM sys_univ_credit;