版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_14852397/article/details/81026174
介绍:
Cursor 是一个记录标识,用于一行一行迭代的访问查询返回的结果。也是一种数据缓冲区的思想,用来存放查询SQL语句执行的返回结果。游标是在先从数据表中检索出数据之后才能继续灵活操作的技术。游标类似于指向数据结构堆栈中的指针,用来pop出所指向的数据,并且只能每次取一个。游标优缺点:
1. 游标的优点;
因为数据库存储过程与存储函数中有时需要用到遍历SQL语句查询的多条记录处理,而存储过程与存储函数又没有类似其他语言中所谓的集合,所以只能通过游标来实现。同时游标也是针对行操作的,所以对从数据库中select查询得到的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想,可以满足对某个结果行进行特殊的操作。
2. 游标的缺点;
因为游标只能一行一行操作类似于集合遍历,在数据量大和业务复杂的情况下是不适用的,处理速度过慢。
游标的使用:
CREATE PROCEDURE INTEREST_DATE()
BEGIN
DECLARE _id VARCHAR(64);
DECLARE _asset_no VARCHAR(64);
DECLARE _repayment_period INT(3);
DECLARE _interest_date DATE;
# 定义游标
DECLARE cur1 CURSOR FOR select id, asset_no, repayment_period from bid_repayment_plan order by id;
# 开启游标
OPEN cur1;
# 迭代游标
FETCH cur1 INTO _id, _asset_no, _repayment_period;
WHILE (_repayment_period IS NOT NULL) DO
CASE _repayment_period
WHEN 1 THEN
select interest_date into _interest_date from asset where asset_no = _asset_no;
# repayment_period = 1
update bid_repayment_plan set interest_date = _interest_date where id = _id and repayment_period = 1;
ELSE
# repayment_period != 1
update bid_repayment_plan set interest_date = DATE_SUB(repayment_at, INTERVAL 1 MONTH) where repayment_period != 1;
END CASE;
# 迭代游标
FETCH cur1 INTO _id, _asset_no, _repayment_period;
END WHILE;
# 关闭游标
CLOSE cur1;
END;