Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2878041
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Mysql/postgreSQL

2012-03-19 21:37:38

游标是系统为用户开设的一个,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
 
概述:

       游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

       游标实现了对mysql的存储过程中循环读取数据表中的对象的过程。

游标的特性:

Ø  READ ONLY 只读,只能取值而不能赋值;

Ø  NOT SCROOLABLE 不可回滚,只能顺序读取;

Ø  ASENSITIVE 敏感,不能在已经打开游标的表上执行update事务;

1.声明光标

MySQL中使用DECLARE关键字来声明光标。其语法的基本形式如下:

1         DECLARE cursor_name CURSOR FOR select_statement ;

其中,cursor_name参数表示光标的名称;select_statement参数表示SELECT语句的内容。

【示例14-8】下面声明一个名为cur_employee的光标。代码如下:

DECLARE cur_employee CURSOR FOR SELECT name, age FROM employee ;

上面的示例中,光标的名称为cur_employeeSELECT语句部分是从employee表中查询出nameage字段的值。

2.打开光标

MySQL中使用OPEN关键字来打开光标。其语法的基本形式如下:

2         OPEN  cursor_name ;

其中,cursor_name参数表示光标的名称。

【示例14-9】下面打开一个名为cur_employee的光标,代码如下:

3         OPEN  cur_employee ;

3.使用光标

MySQL中使用FETCH关键字来使用光标。其语法的基本形式如下:

4         FETCH cur_employee INTO var_name[,var_name] ;

其中,cursor_name参数表示光标的名称;var_name参数表示将光标中的SELECT语句查询出来的信息存入该参数中。var_name必须在声明光标之前就定义好。

【示例14-10】下面使用一个名为cur_employee的光标。将查询出来的数据存入emp_nameemp_age这两个变量中,代码如下:

5         FETCH  cur_employee INTO emp_name, emp_age ;

上面的示例中,将光标cur_employeeSELECT语句查询出来的信息存入emp_nameemp_age中。emp_nameemp_age必须在前面已经定义。

4.关闭光标

MySQL中使用CLOSE关键字来关闭光标。其语法的基本形式如下:

6         CLOSE  cursor_name ;

其中,cursor_name参数表示光标的名称。

【示例14-11】下面关闭一个名为cur_employee的光标。代码如下:

7         CLOSE  cur_employee ;

上面的示例中,关闭了这个名称为cur_employee的光标。关闭之后就不能使用FETCH来使用光标了。

技巧:如果存储过程或函数中执行SELECT语句,并且SELECT语句会查询出多条记录。这种情况最好使用光标来逐条读取记录。光标必须在处理程序之前且在变量和条件之后声明。而且,光标使用完后一定要关闭。

  1. 声明游标: DECLARE cursor_name CURSOR FOR select_statement
  2. 这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。
  3. 打开游标: OPEN cursor_name
  4. 游标FETCH:FETCH cursor_name INTO var_name [, var_name] ...
  5. 这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。
  6. 关闭游标CLOSE: CLOSE cursor_name
  7. 这个语句关闭先前打开的光标。如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。


 

点击(此处)折叠或打开

  1. CREATE PROCEDURE food_price_count (IN price_info1 FLOAT,IN price_info2 FLOAT, OUT count INT )
  2.    READS SQL DATA
  3.    BEGIN
  4.     DECLARE temp FLOAT;
  5.     DECLARE match_price CURSOR FOR SELECT price FROM food;
  6.     DECLARE EXIT HANDLER FOR NOT FOUND CLOSE match_price;
  7.     SET @sum=0;
  8.     SELECT COUNT(*) INTO count FROM food
  9.      WHERE price>price_info1 AND price<price_info2 ;
  10.     OPEN match_price;
  11.     REPEAT
  12.      FETCH match_price INTO temp;
  13.      IF temp>price_info1 AND temp<price_info2
  14.         THEN SET @sum=@sum+temp;
  15.     END IF;
  16.     UNTIL 0 END REPEAT;
  17.     CLOSE match_price;
  18.    END



 

阅读(692) | 评论(0) | 转发(0) |
0

上一篇:mysql存储过程例子

下一篇:mysql 性能优化

给主人留下些什么吧!~~