個人覺得就是一個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)必須在聲明處理程序之前被聲明,并且變量和條件必須在聲明游標或處理程序之前被聲明.
新聞熱點
疑難解答