游标
游标是一个存储在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();