当前位置:首页 > Mysql教程 > 列表

mysql的游标怎么使用

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-10 11:10:45 浏览: 评论:0 

个人觉得就是一个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,代码如下:

  1. //建立表结构 
  2. create table person(name varchar(10)); 
  3.  
  4. insert into person values(¹a¹); 
  5. insert into person values(¹b¹); 
  6. insert into person values(¹c¹); 
  7. insert into person values(¹d¹); 
  8. insert into person values(¹e¹); 
  9.  
  10. //初始化  
  11. drop procedure if exists  cursorTest   
  12.  
  13. //建立 
  14. CREATE PROCEDURE cursorTest() 
  15.     BEGIN 
  16.  
  17.  //定义变量 
  18.          declare name1 varchar(10) default ¹¹ ; 
  19.          declare name2 varchar(100) default ¹¹ ; 
  20.  
  21.          declare mycursor CURSOR FOR select name from person; 
  22.  
  23.          declare CONTINUE HANDLER FOR SQLSTATE ¹02000¹ SET tmpname = null
  24.  
  25.  //打开游标  
  26.  OPEN mycursor; 
  27.  
  28.  //遍历游标 
  29.  FETCH mycursor INTO name1; 
  30.  
  31.  //把游标查询出的 name 都加起并用 ; 号隔开 
  32.  WHILE( name1 is not null) DO 
  33.   set name1 = CONCAT(name1, ";") ; 
  34.   set name2 = CONCAT(name2, name1) ; 
  35.   FETCH mycursor INTO name1; 
  36.  END WHILE; 
  37.  CLOSE mycursor; 
  38. --phpfensi.com 
  39.  select mycursor; 
  40.     END
  41.  
  42. //调用游标 
  43. call mycursor() 
  44.  
  45.  
  46.  
  47. --运行结果: 
  48.  
  49. mysql> call mycursor() 
  50. +--------------------------------------+ 
  51.  
  52. | name2                                | 
  53.  
  54. +--------------------------------------+ 
  55.  
  56. | a;b;c;d;e;                           | 
  57.  
  58. +--------------------------------------+ 
  59.  
  60. 1 row in set (0.01 sec) 

例2,一个完整的例子,代码如下:

  1. -- 定义本地变量 
  2.  
  3.   DECLARE o varchar(128); 
  4.  
  5.  
  6.  -- 定义游标 
  7.  
  8.  DECLARE ordernumbers CURSOR 
  9.  
  10.  FOR 
  11.  
  12.  SELECT callee_name FROM account_tbl where acct_timeduration=10800; 
  13.  
  14.  DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1; 
  15.  
  16.  SET no_more_departments=0; 
  17.  
  18.   
  19.  -- 打开游标 
  20.  
  21.  OPEN ordernumbers; 
  22.  
  23.  
  24.  -- 循环所有的行 
  25.  
  26.  REPEAT 
  27.  
  28.      -- Get order number 
  29.  
  30.     FETCH ordernumbers INTO o; 
  31.  
  32.     update account set allMoney=allMoney+72,lastMonthConsume=lastMonthConsume-72 where NumTg=@o; 
  33.     
  34.     
  35. -- 循环结束 
  36.  
  37.     UNTIL no_more_departments 
  38.    END REPEAT; 
  39.  
  40.  -- 关闭游标 
  41.  
  42.  CLOSE ordernumbers; 

游标(cursor)的特性

1,只读的,不能更新的.

2,不滚动的.

3,不敏感的,不敏感意为服务器可以活不可以复制它的结果表.

游标(cursor)必须在声明处理程序之前被声明,并且变量和条件必须在声明游标或处理程序之前被声明.

Tags: mysql游标 cursor FETCH

分享到: