个人觉得就是一个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,代码如下:
- //建立表结构
- create table person(name varchar(10));
-
- insert into person values(¹a¹);
- insert into person values(¹b¹);
- insert into person values(¹c¹);
- insert into person values(¹d¹);
- insert into person values(¹e¹);
-
- //初始化
- drop procedure if exists cursorTest
-
- //建立
- CREATE PROCEDURE cursorTest()
- BEGIN
-
- //定义变量
- declare name1 varchar(10) default ¹¹ ;
- declare name2 varchar(100) default ¹¹ ;
-
- declare mycursor CURSOR FOR select name from person;
-
- declare CONTINUE HANDLER FOR SQLSTATE ¹02000¹ SET tmpname = null;
-
- //打开游标
- OPEN mycursor;
-
- //遍历游标
- FETCH mycursor INTO name1;
-
- //把游标查询出的 name 都加起并用 ; 号隔开
- WHILE( name1 is not null) DO
- set name1 = CONCAT(name1, ";") ;
- set name2 = CONCAT(name2, name1) ;
- FETCH mycursor INTO name1;
- END WHILE;
- CLOSE mycursor;
-
- select mycursor;
- END;
-
- //调用游标
- call mycursor()
-
-
-
-
-
- mysql> call mycursor()
- +
-
- | name2 |
-
- +
-
- | a;b;c;d;e; |
-
- +
-
- 1 row in set (0.01 sec)
例2,一个完整的例子,代码如下:
-
-
- DECLARE o varchar(128);
-
-
-
-
- DECLARE ordernumbers CURSOR
-
- FOR
-
- SELECT callee_name FROM account_tbl where acct_timeduration=10800;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;
-
- SET no_more_departments=0;
-
-
-
-
- OPEN ordernumbers;
-
-
-
-
- REPEAT
-
-
-
- FETCH ordernumbers INTO o;
-
- update account set allMoney=allMoney+72,lastMonthConsume=lastMonthConsume-72 where NumTg=@o;
-
-
-
-
- UNTIL no_more_departments
- END REPEAT;
-
-
-
- CLOSE ordernumbers;
游标(cursor)的特性
1,只读的,不能更新的.
2,不滚动的.
3,不敏感的,不敏感意为服务器可以活不可以复制它的结果表.
游标(cursor)必须在声明处理程序之前被声明,并且变量和条件必须在声明游标或处理程序之前被声明. |