oracle存储过程遍历游标问题

oracle存储过程遍历游标问题,第1张

第二段代码是对的,

第一段代码是错的,你有没有发现,你第一段代码 的两条,后一条 应该是空值

还没有 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  /*关闭游标*/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9419706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存