游标



在前面的分析中可知sql的检索操作返回的数据几乎都是以整个集合的形式,也就是说sql善于将多条查询记录集中到一起并返回,倘若现在需要一行行地处理查询的结果,这对于sql语句来说确实是个难题,好在存在一种称为游标的技术可以解决这个问题,所谓的游标就就是可以将检索出来的数据集合保存在内存中然后依次取出每条数据进行处理,这样就解决了sql语句无法进行行记录处理的难题,游标的读取图解如下:



 




数据库之 游标的解读和使用_经验分享



数据库之 游标的解读和使用_数据库_02



数据库之 游标的解读和使用_数据库_03


 


原表:


 



数据库之 游标的解读和使用_程序人生_04


 



数据库之 游标的解读和使用_其他_05


 



数据库之 游标的解读和使用_经验分享_06


 


 


批量(游标)取值:


fetch 游标名称 into @变量1,@变量2,@变量3。。。//这里设置值跟查询语句的列一一对应。所以别写错位置了


 


 


mysql存储过程使用表名作为参数-----------实现动态游标


 



数据库之 游标的解读和使用_其他_07


视图部分。


 



数据库之 游标的解读和使用_mysql_08


 


例如上述,我写的是利用游标,清空对应的表,但会出现表“不存在”的情况。


 



数据库之 游标的解读和使用_数据库_09



数据库之 游标的解读和使用_程序人生_10


 


 


 


存储过程语句:


CREATE DEFINER=`root`@`%` PROCEDURE `sp_empty_table`()



BEGIN



declare flag int default 0;#定义标识变量用于判断是否退出循环



declare tmp varchar(40);#定义临时存储变量



declare cur cursor for select name from view_all_table where name not LIKE 'sys_%' ;#声明游标



declare continue handler for not found set flag = 1; #异常处理并设置flag=1



open cur; # 打开游标



while flag!=1 do



fetch cur into tmp ;#从游标中取值并存放到tmp中



if flag !=1 then


SET @sqlcmd = concat('truncate table ', tmp);

prepare stmt from @sqlcmd;

execute stmt;

deallocate prepare stmt;


#truncate table tmp;



end if;



end while;



close cur; #关闭游标



END