MySQL储存过程-游标的使用

第一次写博客哈哈,借博客来记录一下自己使用游标的理解

1.游标介绍

MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解。

有数据缓冲的思想:游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。 先有数据基础:游标是在先从数据表中检索出数据之后才能继续灵活操作的技术。 类似于指针:游标类似于指向数据结构堆栈中的指针,用来pop出所指向的数据,并且只能每次取一个。

因为游标是针对行操作的,所以对从数据库中select查询得到的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。可以满足对某个结果行进行特殊的操作

通俗来说,就是一个可读的标识,用来标识数据取到什么地方了

2.使用场景

我总结游标的使用场景,主要用在循环处理、存储过程、函数中使用,用来查询结果集,就比如:我们需要从表中循环判断并得到想要的结果集,这时候使用游标操作很方便速度也很快。

最近在公司处理业务经常需要用到游标,所以将使用方法做下记录以备日后查看:给商品管理新增的系统默认套餐补充系统商品,找出商家账户下所有系统默认套餐是否有套餐已被添加了商品,如果没有添加商品则需要添加上系统商品

过程如下:

BEGIN
	DECLARE pack_id INT(11) DEFAULT 0;
	DECLARE cnt INT(11) DEFAULT 0;

    #用于退出循环的标识
	DECLARE no_more_record INT DEFAULT 0;

    #定义游标
	DECLARE cur_record CURSOR FOR

        #查询出商家下所有系统默认套餐,和套餐下所有商品
		SELECT pack.id, COUNT(e.product_id) AS cnt
		FROM (
			SELECT id
			FROM tbl_product_package
			WHERE mch_id = 0
		) pack
			LEFT JOIN tbl_product_easy e
			ON pack.id = e.product_package
				AND e.mch_id = _mch_id
		GROUP BY pack.id

	DECLARE CONTINUE HANDLER FOR NOT FOUND
		SET no_more_record = 1 #当没有数据可以读了,设置为1
    
	OPEN cur_record;#打开游标
	WHILE no_more_record != 1 DO
	FETCH cur_record INTO pack_id, cnt;#读取下一行数据
	IF cnt = 0 THEN #在这里就可以判断商品是否被添加过
		INSERT INTO tbl_product_easy (mch_id, enable_, des, image_addr, total_fee
			, title, quantity, isfree, product_package, sort_id
			, coin_type, _minute)
		SELECT _mch_id, 1, tittle, image_addr, total_fee
			, tittle, coin, 0, `type`, sort_id
			, 0, 0
		FROM tbl_product_easy_template
		WHERE `type` = pack_id;
	END IF;
	END WHILE
	CLOSE cur_record;#使用完要记得释放游标
	RETURN 1;
END

因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕迹

猜你喜欢

转载自blog.csdn.net/qq_31956907/article/details/86229564