第一段代码是错的,你有没有发现,你第一段代码 的两条,后一条 应该是空值
还没有 fetch ,不应该判断 cur%notfound
在fetch后,才应该判断 cur%notfound
看看你的第一段代码:
open cur
loop
exit when cur%notfound
fetch cur into pname,pjob,psal
dbms_output.put_line(pname||'的工作是'||pjob||',薪水是'||psal)
end loop
close cur
-- 第一轮循环, fetch到值, 进行输出
-- 第二轮循环,判断第一轮循环是否取到值; 然后fetch, 此时如果没有值, 你仍然进行输出
-- 第三轮循环,判断第二轮循环是否取到值,没有值,退出
其实你只要一行值符合要求
CREATE DEFINER=`root`@`%` PROCEDURE `insertPresale`()BEGIN
#Routine body goes here...
DECLARE done INT DEFAULT 0 /*用于判断是否结束循环*/
DECLARE goodsId VARCHAR(255)#标记商品id
DECLARE flag INT DEFAULT 0#标记数据库是否包含此条商品记录
/*用于存储结果集的记录*/
/*定义游标*/
DECLARE idCur CURSOR FOR SELECT goods_id FROM `sys_goods_publish` WHERE presale= 1 AND presale_time <= NOW()
/*定义 设置循环结束标识done值怎么改变 的逻辑*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1 /*done = true亦可*/
OPEN idCur /*打开游标*/
/* 循环开始 */
REPEAT
#/* 如果要fetch多列应该这样写,fetch cur/*对应下面的idCur*/
FETCH idCur INTO goodsId /*还可以fetch多列(假设结果集的记录不是单列的话)*/
IF NOT done THEN /*数值为非0,MySQL认为是true*/
SELECT COUNT(*) INTO flag FROM `itemsinfonew` WHERE TaoBaoitemId = goodsId
IF (flag>0) THEN #如果数据库中有爬取此条记录则删除已用户发布的为准
DELETE FROM `itemsinfonew` WHERE TaoBaoitemId = goodsId
END IF
INSERT INTO `itemsinfonew` (TaoBaoitemId,CouponID,CreateSourceName)
SELECT goods_id,coupon_id,SUBSTRING("customer_fd",0.5)
FROM `sys_goods_publish`
WHERE presale_time <= NOW() AND goods_id = goodsId
UPDATE `sys_goods_publish` SET presale = 0 WHERE presale= 1 AND presale_time <= NOW() AND goods_id = goodsId
END IF
UNTIL done END REPEAT
CLOSE idCur /*关闭游标*/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)