个人觉得就是一个cursor,就是一个标识,用来标识数据取到什么地方了,你也可以把它理解成数组中的下标.
使用游标(cursor)
1.声明游标:DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个游标,也可以在子程序中定义多个游标,但是一个块中的每一个游标必须有唯一的名字,声明游标后也是单条操作的,但是不能用SELECT语句不能有INTO子句.
2.游标OPEN语句:OPEN cursor_name
这个语句打开先前声明的游标.
3.游标FETCH语句:FETCH cursor_name INTO var_name [,var_name] ...
这个语句用指定的打开游标读取下一行,如果有下一行的话,并且前进游标指针.
4.游标CLOSE语句:CLOSE cursor_name
这个语句关闭先前打开的游标.
例1,代码如下:
- //建立表结构
- createtableperson(namevarchar(10));
- insertintopersonvalues(¹a¹);
- insertintopersonvalues(¹b¹);
- insertintopersonvalues(¹c¹);
- insertintopersonvalues(¹d¹);
- insertintopersonvalues(¹e¹);
- //初始化
- dropprocedureifexistscursorTest
- //建立
- CREATEPROCEDUREcursorTest()
- BEGIN
- //定义变量
- declarename1varchar(10)default¹¹;
- declarename2varchar(100)default¹¹;
- declaremycursorCURSORFORselectnamefromperson;
- declareCONTINUEHANDLERFORSQLSTATE¹02000¹SETtmpname=null;
- //打开游标
- OPENmycursor;
- //遍历游标
- FETCHmycursorINTOname1;
- //把游标查询出的name都加起并用;号隔开
- WHILE(name1isnotnull)DO
- setname1=CONCAT(name1,";");
- setname2=CONCAT(name2,name1);
- FETCHmycursorINTOname1;
- ENDWHILE;
- CLOSEmycursor;
- --phpfensi.com
- selectmycursor;
- END;
- //调用游标
- callmycursor()
- --运行结果:
- mysql>callmycursor()
- +--------------------------------------+
- |name2|
- +--------------------------------------+
- |a;b;c;d;e;|
- +--------------------------------------+
- 1rowinset(0.01sec)
例2,一个完整的例子,代码如下:
- --定义本地变量
- DECLAREovarchar(128);
- --定义游标
- DECLAREordernumbersCURSOR
- FOR
- SELECTcallee_nameFROMaccount_tblwhereacct_timeduration=10800;
- DECLARECONTINUEHANDLERFORNOTFOUNDSETno_more_departments=1;
- SETno_more_departments=0;
- --打开游标
- OPENordernumbers;
- --循环所有的行
- REPEAT
- --Getordernumber
- FETCHordernumbersINTOo;
- updateaccountsetallMoney=allMoney+72,lastMonthConsume=lastMonthConsume-72whereNumTg=@o;
- --循环结束
- UNTILno_more_departments
- ENDREPEAT;
- --关闭游标
- CLOSEordernumbers;
游标(cursor)的特性
1,只读的,不能更新的.
2,不滚动的.
3,不敏感的,不敏感意为服务器可以活不可以复制它的结果表.
游标(cursor)必须在声明处理程序之前被声明,并且变量和条件必须在声明游标或处理程序之前被声明.