MySql存储过程—7、游标(Cursor)
1、游标的作⽤及属性
游标的作⽤就是⽤于对查询数据库所返回的记录进⾏遍历,以便进⾏相应的操作;游标有下⾯这些属性:
a、游标是只读的,也就是不能更新它;
b、游标是不能滚动的,也就是只能在⼀个⽅向上进⾏遍历,不能在记录之间随意进退,不能跳过某些记录;
c、避免在已经打开游标的表上更新数据。
2、如何使⽤游标
使⽤游标需要遵循下⾯步骤:
a、⾸先⽤DECLARE语句声明⼀个游标
DECLARE cursor_name CURSOR FOR SELECT_statement;
上⾯这条语句就对,我们执⾏的select语句返回的记录指定了⼀个游标
b、其次需要使⽤OPEN语句来打开上⾯你定义的游标
OPEN cursor_name;
c、接下来你可以⽤FETCH语句来获得下⼀⾏数据,并且游标也将移动到对应的记录上(这个就类似java⾥⾯的那个iterator)。
FETCH cursor_name INTO variable list;
d、然后最后当我们所需要进⾏的操作都结束后我们要把游标释放掉。
CLOSE cursor_name;
在使⽤游标时需要注意的是,使⽤定义⼀个针对NOT FOUND的条件处理函数(condition handler)来避免出现“no data to fetch”这样的错误,条件处理函数就是当某种条件产⽣时所执⾏的代码,这⾥但我们游标指到记录的末尾时,便达到NOT FOUND这样条件,这个时候我们希望继续进⾏后⾯的操作,所以我们会在下⾯的代码中看到⼀个CONTINUE。先看看我们的表格内容:
下⾯的游标使⽤演⽰获取库存量⼩于100的产品的代码code,这个代码纯粹演⽰如何使⽤,在这⾥没有其他任何意义:)
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`CursorProc` $$mysql存储过程使用
CREATE PROCEDURE `test`.`CursorProc` ()
BEGIN
DECLARE no_more_products, quantity_in_stock INT DEFAULT 0;
DECLARE prd_code VARCHAR(255);
DECLARE cur_product CURSOR FOR SELECT code FROM products; /*First: Delcare a cursor,⾸先这⾥对游标进⾏定义*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products = 1; /*when "not found" occur,just continue,这个是个条件处理,针对NOT FOUND的
/* for loggging information 创建个临时表格来保持*/
CREATE TEMPORARY TABLE infologs (
Id int(11) NOT NULL AUTO_INCREMENT,
Msg varchar(255) NOT NULL,
PRIMARY KEY (Id)
);
OPEN cur_product; /*Second: Open the cursor 接着使⽤OPEN打开游标*/
FETCH cur_product INTO prd_code; /*Third: now you can Fetch the row 把第⼀⾏数据写⼊变量中,游标也随之指向了记录的第⼀⾏*/
REPEAT
SELECT quantity INTO quantity_in_stock
FROM products
WHERE code = prd_code;
IF quantity_in_stock < 100 THEN
INSERT INTO infologs(msg)
VALUES (prd_code);
END IF;
FETCH cur_product INTO prd_code;
UNTIL no_more_products = 1
END REPEAT;
CLOSE cur_product; /*Finally: cursor need be closed ⽤完后记得⽤CLOSE把资源释放掉*/
SELECT * FROM infologs;
DROP TABLE infologs;
END $$
DELIMITER ;
下⾯是最终的结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论