1、游标的作用及属性
游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作;游标有下面这些属性:
a、游标是只读的,也就是不能更新它;
b、游标是不能滚动的,也就是只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录;
c、避免在已经打开游标的表上更新数据。
2、如何使用游标
使用游标需要遵循下面步骤:
a、首先用DECLARE语句声明一个游标
DECLAREcursor_nameCURSORFORSELECT_statement;
上面这条语句就对,我们执行的select语句返回的记录指定了一个游标
b、其次需要使用OPEN语句来打开上面你定义的游标
OPENcursor_name;
c、接下来你可以用FETCH语句来获得下一行数据,并且游标也将移动到对应的记录上(这个就类似java里面的那个iterator)。
FETCHcursor_nameINTOvariable list;
d、然后最后当我们所需要进行的操作都结束后我们要把游标释放掉。
CLOSEcursor_name;
在使用游标时需要注意的是,使用定义一个针对NOT FOUND的条件处理函数(condition handler)来避免出现“no data to fetch”这样的错误,条件处理函数就是当某种条件产生时所执行的代码,这里但我们游标指到记录的末尾时,便达到NOT FOUND这样条件,这个时候我们希望继续进行后面的操作,所以我们会在下面的代码中看到一个CONTINUE。先看看我们的表格内容:
下面的游标使用演示获取库存量小于100的产品的代码code,这个代码纯粹演示如何使用,在这里没有其他任何意义:)
DELIMITER $$
DROPPROCEDUREIF EXISTS `test`.`CursorProc` $$
CREATEPROCEDURE`test`.`CursorProc` ()
BEGIN
DECLAREno_more_products, quantity_in_stockINTDEFAULT0;
DECLAREprd_codeVARCHAR(255);
DECLAREcur_productCURSORFORSELECTcodeFROMproducts; /*First: Delcare acursor,首先这里对游标进行定义*/
DECLARECONTINUEHANDLERFORNOTFOUNDSETno_more_products = 1; /*when"not found"occur,justcontinue,这个是个条件处理,针对NOTFOUND的条件*/
/* forloggging information 创建个临时表格来保持*/
CREATETEMPORARYTABLEinfologs (
Id int(11)NOTNULLAUTO_INCREMENT,
Msg varchar(255)NOTNULL,
PRIMARYKEY(Id)
);
OPENcur_product; /*Second:Openthecursor接着使用OPEN打开游标*/
FETCHcur_productINTOprd_code; /*Third: now you canFetchthe row 把第一行数据写入变量中,游标也随之指向了记录的第一行*/
REPEAT
SELECTquantityINTOquantity_in_stock
FROMproducts
WHEREcode = prd_code;
IF quantity_in_stock
INSERTINTOinfologs(msg)
VALUES(prd_code);
ENDIF;
FETCHcur_productINTOprd_code;
UNTIL no_more_products = 1
ENDREPEAT;
CLOSEcur_product; /*Finally:cursorneed be closed 用完后记得用CLOSE把资源释放掉*/
SELECT*FROMinfologs;
DROPTABLEinfologs;
END$$
DELIMITER ;