萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql的游標怎麼使用

mysql的游標怎麼使用

個人覺得就是一個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

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

copyright © 萬盛學電腦網 all rights reserved