#检查是否有重复名称 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;