2

MySQL通过游标(CURSOR)实现对select选择集的迭代使用,解决在Navicat中声明游标就一直...

 1 year ago
source link: https://blog.51cto.com/u_15885037/5874356
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1 问题描述

我的需求是,一条一条的读取并使用select选择集的结果,使用的数据库可视化软件是Navicat。
但是我在使用游标的过程中一直在游标声明处就报错,试了很多方法,改名字,调整变量顺序都不管用,最后发现,游标需要定义在存储过程(Stored Procedure)函数里。

2 MySQL 存储过程

2.1 MySQL 存储过程简介

MySQL 5.0 版本开始支持存储过程。
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

2.2 MySQL 存储过程使用的基本步骤

2.2.1 声明存储过程

CREATE PROCEDURE pro_b ()

创建的存储过程函数可以在函数对象中查看。
MySQL通过游标(CURSOR)实现对select选择集的迭代使用,解决在Navicat中声明游标就一直报错的问题_Navicat

2.2.2 存储过程开始和结束符号:

BEGIN .... END    

2.2.3 调用存储过程

CALL pro_b ();

2.2.4 删除存储过程(可选)

DROP PROCEDURE pro_b;

3.1 游标简介

在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的数据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。
关系数据库管理系统实质是面向集合的,在 MySQL 中并没有一种描述表中单一记录的表达形式,除非使用 WHERE 子句来限制只有一条记录被选中。所以有时我们必须借助于游标来进行单条记录的数据处理。

3.2 游标的使用过程

4 完整代码

CREATE PROCEDURE pro_b () BEGIN
	DECLARE
		uID INT; #uID:t_workd的userID字段
	DECLARE
		isC INT;	#isC:t_workd的isCompetition字段
	DECLARE
		a INT;		##a:游标遍历完的标志
	DECLARE
		mycursor CURSOR FOR SELECT
		isCompetition,
		userID 
	FROM
		t_work
	WHERE
		userID > 14000;
	DECLARE
		CONTINUE HANDLER FOR NOT FOUND 
		SET a = 1;#当读到数据的最后一条时,设置a变量为1
	UPDATE t_user 
	SET uploadNum = 0;
	UPDATE t_user 
	SET markNum = 0;
	
	SET uID = 0;
	
	SET isC = 0;
	
	SET a = 0;#初始化变量no为0
	OPEN mycursor;#打开游标
	WHILE
			a = 0 DO#判断是不是到了最后一条数据
			FETCH mycursor INTO isC,
			uID;#读取游标中的数据分别一一存储
		UPDATE t_user 
		SET uploadNum = uploadNum + 1 
		WHERE
			uID = t_user.id;
		UPDATE t_user 
		SET markNum = markNum + 1 
		WHERE
			uID = t_user.id 
			AND isC = 1;
		
	END WHILE;
	CLOSE mycursor;#关闭游标,清理游标数据
	
END;
CALL pro_b ();

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK