在这里插入图片描述MySQL中的游标1.什么是游标
虽然我们也可以通过筛选条件WHERE和HAVING,或者是限定返回记录的关键字LIMIT返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是随意定位到某一条记录,并对记录的数据进行处理。
这个时候,就可以用到游标。游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。游标让SQL这种面向集合的语言有了面向过程开发的能力。
在SQL中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用,我们可以通过操作游标来对数据行进行操作。
MySQL中游标可以在存储过程和函数中使用。
在这里插入图片描述2.使用游标的步骤游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。如果我们想要使用游标,一般需要经历四个步骤。不同的DBMS中,使用游标的语法可能略有不同。
2.1声明游标使用DECLARE关键字来声明游标,其语法的基本形式如下:
DECLAREcursor_nameCURSORFORselect_statement;
要使用SELECT语句来获取数据结果集,而此时还没有开始遍历数据,这里select_statement代表的是SELECT语句,返回一个用于创建游标的结果集。
比如:
DECLAREcur_scoreCURSORFORSELECTstu_id,gradeFROMscore;2.2打开游标
打开游标的语法如下:
OPENcursor_name
当我们定义好游标之后,如果想要使用游标,必须先打开游标。打开游标的时候SELECT语句的查询结果集就会送到游标工作区,为后面游标的逐条读取结果集中的记录做准备.
opencur_score;2.3使用游标
语法如下:
FETCHcursor_nameINTOvar_name[,var_name]...
这句的作用是使用cursor_name这个游标来读取当前行,并且将数据保存到var_name这个变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在INTO关键字后面赋值给多个变量名即可。
注意:var_name必须在声明游标之前就定义好.
FETCHcur_scoreINTOstu_id,grade;
注意:「游标的查询结果集中的字段数,必须跟」「INTO」「后面的变量数一致」,否则,在存储过程执行的时候,MySQL会提示错误。
2.4关闭游标关闭游标使用CLOSE关键字
CLOSEcursor_name;
有OPEN就会有CLOSE,也就是打开和关闭游标。当我们使用完游标后需要关闭掉该游标。因为游标会占用系统资源,如果不及时关闭,「游标会一直保持到存储过程结束」,影响系统运行的效率。而关闭游标的操作,会释放游标占用的系统资源。
关闭游标之后,我们就不能再检索查询结果中的数据行,如果需要检索只能再次打开游标。
CLOSEcur_score;3.案例讲解
创建一个存储过程,实现累加考试成绩最高的几个学员的总分,直到总和大于我们传入的limit_total_grade的参数值,并且返回累加的人数:total_count;
CREATEPROCEDUREPROC_CURSOR(INLIMIT_TOTAL_GRADEINT,OUTTOTAL_COUNTINT)BEGIN#声明相关的变量DECLARESUM_GRADEINTDEFAULT0;#累加的总成绩DECLARECURSOR_GRADEINTDEFAULT0;#记录某条成绩DECLARESCORE_COUNTINTDEFAULT0;#记录累加的记录数#定义游标DECLARESCORE_CURSORCURSORFORSELECTGRADEFROMSCOREORDERBYGRADE;#打开游标OPENSCORE_CURSOR;#使用游标REPEATFETCHSCORE_CURSORINTOCURSOR_GRADE;#从游标中获取一条数据SETSUM_GRADE=SUM_GRADE+CURSOR_GRADE;#成绩累加SETSCORE_COUNT=SCORE_COUNT+1;#记录累加的次数UNTILSUM_GRADELIMIT_TOTAL_GRADE#退出条件ENDREPEAT;#复制OUT参数SETTOTAL_COUNT=SCORE_COUNT;#关闭游标CLOSESCORE_CURSOR;END;DROPPROCEDUREPROC_CURSOR#调用存储过程SET
s_count=0;CALLPROC_CURSOR(,s_count);SELECTs_count;4.小结游标是MySQL的一个重要的功能,为逐条读取结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。
但同时也会带来一些性能问题,比如在使用游标的过程中,会对数据行进行加锁,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,这是因为游标是在内存中进行的处理。
建议:养成用完之后就关闭的习惯,这样才能提高系统的整体效率。