可以从字面上理解什么是游标。光标就像漂浮在水面上的标记。这个标记可以来回游动,游来游去一会儿,这里的河流可以理解为一个数据的集合,而这个标记就是在这些数据之间来回游动。为什么MySQL会有游标的概念?由于SQL语言是面向集合的语句,每次查询都是一堆数据的集合,没办法单独处理其中的一条记录。如果要单独处理每条记录,则需要游标。游标其实就像编程语言中的for/foreach循环,将数组(数据的集合)中的每条数据一个一个循环出来,然后你用for/foreach循环中的判断语句去检查您感兴趣的数据。处理。游标可以用在什么地方?函数、存储过程和触发器都可以使用。说完概念,我们再来看看下游游标的固定写法。不管概念是否理解,记住以下固定模式也能完成搬砖的任务。1.声明游标DECLARE游标名CURSORFORSELECT语句;SELECT语句是一个普通的查询语句,例如:SELECTid,ageFROMtable;2.打开游标OPEN游标名;在打开游标之前,游标定义的SQL语句是不会执行的。3.取记录FETCH游标名INTO变量1[,变量2,变量3];将当前记录数据存储到变量中。当FETCH没有找到记录时抛出异常,异常的定义需要下面的HANDLERFOR语句。如果声明的游标语句中的SELECT语句中有多个字段,则需要在INTO之后接收多个变量。4、设置结束条件DECLARE处理类型HANDLERFOR异常类型异常发生时的处理这条语句的作用是指定一个条件,告诉程序所有数据已经??循环完毕,可以结束了。由于游标是使用WHILE循环读取每条数据,所以需要给WHILE一个结束条件。ProcessingKind:是,EXIT立即结束。CONTINUE继续下面的处理。异常类型:一般指定为NOTFOUND,表示没有找到数据。Handlingwhenexceptionoccurs:发生异常时需要做什么。这里一般会改变一个变量的值来记录异常发生,比如SETflat=1,具体用法见下面的例子。5.关闭游标CLOSE游标名称;实战代码:CREATEPROCEDUREsp_abc()BEGIN--定义一个变量,临时存储所有以逗号分隔的客户名称DECLAREresultVARCHAR(1000)DEFAULT'';--定义一个标志变量,用来判断是否取出所有记录,我这里设置了,1表示没有记录,0表示有记录。声明标志INTDEFAULT0;--定义一个临时变量存放当前记录的客户名称DECLAREtmpVARCHAR(50)DEFAULT'';--定义游标,打开游标前,不执行SELECT语句DECLAREcurCURSORFORSELECT`name`FROMkefu;--设置结束条件,没有记录时抛出NOTFOUND异常,设置flag等于1DECLARECONTINUEHANDLERFORNOTFOUNDSETflag=1;--打开游标OPENcur;--定义循环,从游标中一条一条取记录WHILEflag!=1DO--将SELECT语句当前行的name字段保存到tmp变量--如果SELECT指定多个字段,则需要INTO后面跟着多个变量,例如:tmp1,tmp2,每个变量分别存储一个字段的值FETCHcurINTOtmp;--这里需要判断,因为上面定义的异常发生,继续处理CONTINUE,而FETCH发生异常时tmp没有得到正确的值。所以IF里面的语句块不应该被执行。IFflag!=1THENSETresult=CONCAT_WS(',',result,tmp);万一;结束时;--关闭游标CLOSEcur;--最后,你可以根据自己的情况处理result变量SELECTresult;END;完了,你看懂了吗?看不懂也没关系。游标处理是一套固定的格式。按照上面例子中的固定格式插入到你的程序中即可。
