MYSQL没有隐式和显式游标之分,所用的游标都是显式游标,也就是必须要进行定义游标变量,然后按照正规的流程使用,打开、遍历、关闭。以下是具体的使用方法。
游标定义
1. DECLARE cursor_name CURSOR FOR SELECT_statement;
游标操作
OPEN 打开游标
1. OPEN cursor_name;
FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH
1. FETCH cursor_name INTO variable list;
CLOSE关闭游标
1. CLOSE cursor_name ;
注意:MySQL的游标是向前只读的,也就是说,你只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录.
一个完整的例子:
定义本地变量
1. DECLARE o varchar(128);
定义游标
1. DECLARE ordernumbers CURSOR
2. FOR
3. SELECT callee_name FROM account_tbl where acct_timeduration=10800;
4. DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;
5. SET no_more_departments=0;
打开游标
1. OPEN ordernumbers;
循环所有的行
1. REPEAT
2. -- Get order number
3. FETCH ordernumbers INTO o;
4. update account set allMoneyallMoney=allMoney+72,lastMonthConsumelastMonthConsume=lastMonthConsume-72 where NumTg=@o;
循环结束
1. UNTIL no_more_departments
2. END REPEAT;
关闭游标
1. CLOSE ordernumbers;
-------
类似于动态游标的示例,作一个动态视力,游标还是固定不变的
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_procedurecode`()
BEGIN
DECLARE tblName varchar(20);
DECLARE done INT DEFAULT 0;
DECLARE b,c varchar(20);
DECLARE bOVER BOOLEAN DEFAULT FALSE;
DECLARE cur1 CURSOR FOR SELECT ip FROM v_wondyfox;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET bOVER=TRUE;
drop view if exists v_wondyfox ;
set tblName='`20120509`';
set @sql=concat("create view v_wondyfox as select ip from cmdb.", tblName);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1 ;
DEALLOCATE PREPARE stmt1;
OPEN cur1;
REPEAT
FETCH cur1 INTO b;
insert into iptest select b;
UNTIL bOVER END REPEAT;
CLOSE cur1;
END