MySQL——游标

版权声明:最终解释权归属Hern所有,恒! https://blog.csdn.net/qq_36761831/article/details/83794664

游标

游标是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后没应用程序可以根据需要滚动或浏览其中的数据。

注意:

1、和其他DBMS相比,MySQL游标只能用于存储过程、函数、循环处理。

2、游标只能一行一行操作,在数据量大的情况下,是不适用的,速度过慢,同时会造成内存不足的现象,给服务器带来严重的性能问题。而且数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其他的业务操作,这样非常不可取。 

游标使用规则

1、在使用游标前必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句。

2、 一旦声明后必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。

3、对于填有数据的游标,根据需要取出(检索)各行。

4、在结束游标使用时,必须关闭游标。

创建游标

游标用 DECLARE语句创建,DECLARE命名游标,并的定义相应的SELECT语句,根据需要带WHERE和其他子句。

语法

CREATE PROCEDURE 存储过程名称()
BEGIN
    DECLARE 游标名称 CURSOR
    FOR
    SELECT语句;
END;

打开、使用、关闭游标

游标用OPEN CURSOR语句打开,语法

OPEN 游标名称;

在有个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索出什么数据(所需的列),检索出来的数据存储在什么地方,并且还可以向前移动尤标忠的内部行指针,是下一条FETCH语句检索下一行(不重复读取同一行)。语法

FETCH [NEXT | PRIOR | FIRST | LAST] FROM <游标名> [ INTO 变量名1,变量名2,变量名3,…];


NEXT:取下一行的数据,游标一开始默认的第一行之前,故要让游标指向第一行,就必须第一次就执行FETCH NEXT操作

INTO:将一行中每个对应的列下的数据放到与列 的数据类型相同的变量中。

游标处理完成后应当使用CLOSE CURSOR语句关闭游标,语法

CLOSE 游标名称;

释放游标将会释放所有内部内存和资源,因此在每个游标不再需要时都应该关闭。在一个游标关闭后,如果没有重新打开,则不能使用它,但使用声明过的游标不需要再次声明,只需要用OPEN语句打开它即可。

注意:(隐含关闭)若不明确的关闭游标,MySQL将会在到达END语句时自动关闭游标,不过建议最好是自己明确指明关闭游标。

例子:

1、从游标中检索单个行(对检索的数据不做任何处理)。

CREATE PROCEDURE p_test()
BEGIN
	/*--定义局部变量id_num的默认值为4--*/
	DECLARE id_population int;
	
	/*--定义游标city_cursor--*/
	DECLARE city_cursor CURSOR
	FOR
		SELECT Population
		FROM city;
		
	/*--打开游标--*/
	OPEN city_cursor;
	
	/*--检索数据--*/
	FETCH city_cursor INTO id_population;
	
	/*--关闭游标--*/
	CLOSE city_cursor;

END;


/*--调用存储过程--*/
CALL p_test();

2、循环检索数据,从第一行到最后一行

CREATE PROCEDURE p_test()
BEGIN
 DECLARE  no_more_record INT DEFAULT 0;
 DECLARE  pID BIGINT(20);
 DECLARE  pValue DECIMAL(15,5);
 DECLARE  cur_record CURSOR
 FOR
	SELECT colA, colB 
	from tableABC;  /*首先这里对游标进行定义*/
	
 DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_record = 1; /*这个是个条件处理,针对NOT FOUND的条件,当没有记录时赋值为1*/
 
 OPEN  cur_record; /*接着使用OPEN打开游标*/
 
 FETCH  cur_record INTO pID, pValue; /*把第一行数据写入变量中,游标也随之指向了记录的第一行*/
 
 WHILE no_more_record != 1 DO
 INSERT  INTO testTable(ID, Value) VALUES  (pID, pValue);
 FETCH  cur_record INTO pID, pValue;
 END WHILE;
 
 CLOSE  cur_record;  /*用完后记得用CLOSE把资源释放掉*/
 
END


/*--调用存储过程--*/
CALL p_test();

猜你喜欢

转载自blog.csdn.net/qq_36761831/article/details/83794664
今日推荐