个人觉得就是一个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;
- --Vevb.com
- 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
- -- Get order number
- 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)必须在声明处理程序之前被声明,并且变量和条件必须在声明游标或处理程序之前被声明.
新闻热点
疑难解答