游标是mysql存储过程中一个比较强大的功能,用到最多的就是存储过程中游标功能了,下面将给您介绍一个关于mysql存储过程中游标一些实例,希望给你带来帮助.
例,代码如下:
- DELIMITER$$
- DROPPROCEDUREIFEXISTSgetUserInfo$$
- CREATEPROCEDUREgetUserInfo(indate_daydatetime)
- --
- --实例
- --MYSQL存储过程名为:getUserInfo
- --参数为:date_day日期格式:2008-03-08
- --
- BEGIN
- declare_userNamevarchar(12);--用户名
- declare_chineseint;--语文
- declare_mathint;--数学
- declaredoneint;
- --定义游标
- DECLARErs_cursorCURSORFORSELECTusername,chinese,mathfromuserInfowheredatediff(createDate,date_day)=0;
- DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;
- --获取昨天的日期
- ifdate_dayisnullthen
- setdate_day=date_add(now(),interval-1day);
- endif;
- openrs_cursor;
- cursor_loop:loop
- FETCHrs_cursorinto_userName,_chinese,_math;--取数据
- ifdone=1then
- leavecursor_loop;
- endif;
- --更新表
- updateinfoSumsettotal=_chinese+_mathwhereUserName=_userName;
- endloopcursor_loop;
- closers_cursor;
- END$$
- DELIMITER;
以上就是MYSQL存储过程中使用游标的实例介绍,如果多游标怎么用,下面我再用同样的实例来介绍.
mysql的存储过程可以很方便使用游标来实现一些功能,存储过程的写法大致如下,先创建一张表,插入一些测试数据,代码如下:
- DROPTABLEIFEXISTSnetingcn_proc_test;
- CREATETABLE`netingcn_proc_test`(
- `id`INTEGER(11)NOTNULLAUTO_INCREMENT,
- `name`VARCHAR(20),
- `password`VARCHAR(20),
- PRIMARYKEY(`id`)
- )ENGINE=InnoDB;
- insertintonetingcn_proc_test(name,password)values
- ('procedure1','pass1'),
- ('procedure2','pass2'),
- ('procedure3','pass3'),
- ('procedure4','pass4');
下面就是一个简单存储过程的例子,代码如下:
- dropprocedureIFEXISTStest_proc;
- delimiter//
- createproceduretest_proc()
- begin
- --声明一个标志done,用来判断游标是否遍历完成
- DECLAREdoneINTDEFAULT0;
- --声明一个变量,用来存放从游标中提取的数据
- --特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL
- DECLAREtnamevarchar(50)DEFAULTNULL;
- DECLAREtpassvarchar(50)DEFAULTNULL;
- --声明游标对应的SQL语句
- DECLAREcurCURSORFOR
- selectname,passwordfromnetingcn_proc_test;
- --在游标循环到最后会将done设置为1
- DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;
- --执行查询
- opencur;
- --遍历游标每一行
- REPEAT
- --把一行的信息存放在对应的变量中
- FETCHcurINTOtname,tpass;
- ifnotdonethen
- --这里就可以使用tname,tpass对应的信息了
- selecttname,tpass;
- endif;
- UNTILdoneENDREPEAT;
- CLOSEcur;
- end
- //
- delimiter;
-- 执行存储过程
call test_proc();需要注意的是变量的声明、游标的声明和HANDLER声明的顺序不能搞错,必须是先声明变量,再申明游标,最后声明HANDLER,上述存储过程的例子中只使用了一个游标,那么如果要使用两个或者更多游标怎么办,其实很简单,可以这么说,一个怎么用两个就是怎么用的,例子如下:
- dropprocedureIFEXISTStest_proc_1;
- delimiter//
- createproceduretest_proc_1()
- begin
- DECLAREdoneINTDEFAULT0;
- DECLAREtidint(11)DEFAULT0;
- DECLAREtnamevarchar(50)DEFAULTNULL;
- DECLAREtpassvarchar(50)DEFAULTNULL;
- DECLAREcur_1CURSORFOR
- selectname,passwordfromnetingcn_proc_test;
- DECLAREcur_2CURSORFOR
- selectid,namefromnetingcn_proc_test;
- DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;
- opencur_1;
- REPEAT
- FETCHcur_1INTOtname,tpass;
- ifnotdonethen
- selecttname,tpass;
- endif;
- UNTILdoneENDREPEAT;
- CLOSEcur_1;
- --注意这里,一定要重置done的值为0
- setdone=0;
- opencur_2;
- REPEAT
- FETCHcur_2INTOtid,tname;
- ifnotdonethen
- selecttid,tname;
- endif;
- UNTILdoneENDREPEAT;
- CLOSEcur_2;
- end
- //
- delimiter;
- calltest_proc_1();
上述代码和第一个例子中基本一样,就是多了一个游标声明和遍历游标,这里需要注意的是,在遍历第二个游标前使用了set done = 0,因为当第一个游标遍历玩后其值被handler设置为1了,如果不用set把它设置为 0,那么第二个游标就不会遍历了,当然好习惯是在每个打开游标的操作前都用该语句,确保游标能真正遍历,当然还可以使用begin语句块嵌套的方式来处理多个游标,例如:
- dropprocedureIFEXISTStest_proc_2;
- delimiter//
- createproceduretest_proc_2()
- begin
- DECLAREdoneINTDEFAULT0;
- DECLAREtnamevarchar(50)DEFAULTNULL;
- DECLAREtpassvarchar(50)DEFAULTNULL;
- DECLAREcur_1CURSORFOR
- selectname,passwordfromnetingcn_proc_test;
- DECLAREcur_2CURSORFOR
- selectid,namefromnetingcn_proc_test;
- DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;
- opencur_1;
- REPEAT
- FETCHcur_1INTOtname,tpass;
- ifnotdonethen
- selecttname,tpass;
- endif;
- UNTILdoneENDREPEAT;
- CLOSEcur_1;
- begin
- DECLAREdoneINTDEFAULT0;
- DECLAREtidint(11)DEFAULT0;
- DECLAREtnamevarchar(50)DEFAULTNULL;
- DECLAREcur_2CURSORFOR
- selectid,namefromnetingcn_proc_test;
- DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;
- opencur_2;//phpfensi.com
- REPEAT
- FETCHcur_2INTOtid,tname;
- ifnotdonethen
- selecttid,tname;
- endif;
- UNTILdoneENDREPEAT;
- CLOSEcur_2;
- end;
- end
- //
- delimiter;
- calltest_proc_2();
关于mysql中 存储过程游标操作的跳出与继续.