使用游標(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
-- 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)必須在聲明處理程序之前被聲明,並且變量和條件必須在聲明游標或處理程序之前被聲明