Mysql 存储过程 - 游标

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;





猜你喜欢

转载自blog.csdn.net/qq_14852397/article/details/81026174