光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。
声明一个光标:
DECLARE <光标名称> CURSOR FOR <选择语句>
打开光标:
OPEN <光标名称>
从光标中读取数据:
FETCH <光标名称> INTO <变量名称>
关闭光标:
CLOSE cursor_<光标名称>
MySQL中的游标分为显式游标和隐式游标,下面分别介绍如何使用。
显式游标
一个在存储程序中使用光标的例子:
drop procedure get_id;
delimiter //
create procedure get_id ()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id char(8);
DECLARE v_name varchar(20);
DECLARE mycur CURSOR FOR SELECT id FROM students;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN mycur;
REPEAT
FETCH mycur INTO v_id;
IF NOT done THEN
INSERT INTO id(id) VALUES (v_id);
END IF;
UNTIL done END REPEAT;
CLOSE mycur;
END
//
delimiter ;
在存储过程中使用了光标时,当所有的数据都Fetch后,没有数据可以获得时将会报"ERROR 1329 (02000): No data - zero rows fetched, selected, or processed"错误。上面利用定义利用例外处理('02000' )来避免错误上述错误。
隐式游标
隐式游标其实就是SELECT INTO语句,隐含开启光标和赋值变量的操作。
DECLARE v_item INT;
SELECT COUNT(*) INTO v_item FROM order WHERE item_id = p_item_id;
Comments
There are currently no comments
New Comment