光标的使用

光标和JAVA程序里面的ResultSet非常相似,可能ResultSet是由光标来实现的吧(玩笑,我没考证过)。每个数据库光标的语法不太相同,但他们作用相同,而且语法类似。由于机器没有ORCALE,我拿了mysql的光标玩了下。

 

主要是用光标批量处理数据,如把一个表中数据符合要求的某些字段照搬到另一个表中,这个功能有没有用就不说了,我们只是学习下光标的使用

mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owener  | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.03 sec)

mysql> describe temp;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

现在我们要把pet表中的name和species这2个字段的所有记录搬到temp表中。

mysql> create procedure copy_data() //创建存贮过程
    -> begin
    -> declare done int default 0;
    -> declare pet_name varchar(20);
    -> declare pet_species varchar(20);
    -> declare cur cursor for select name, species from pet;//创建光标
    -> declare continue handler for sqlstate '02000' set done = 1; //说实话,我只知道这句是控制光标循环的,具体怎么回事我也不清楚,麻烦知道的人回帖告诉下,不胜感激
    ->
    -> open cur;//打开光标
    ->
    -> repeat
    -> fetch cur into pet_name, pet_species;
    -> if not done then
    -> insert into temp values (pet_name, pet_species);
    -> end if;
    -> until done end repeat;
    -> close cur;//关闭光标
    -> end
    -> //
Query OK, 0 rows affected (0.00 sec)

 

这样,光标的简单例子就做好了。

你可能感兴趣的:(mysql)