1.存储过程中光标的使用
在存储过程中执行查询语句,有时候可能会查询出很多条记录,此时,如果想逐条读取查询结果集中的记录,就需要使用光标(有的书上叫游标)。
接下来将介绍光标在存储过程中的使用。
1)声明光标
DECLARE curEmployee CURSOR FOR select Name,Address from employee;
注释:curEmployee代表声明的光标名。
2)打开光标
OPEN curEmployee;
3)使用光标
FETCH curEmployee INTO _name,_address;
注释:上面代码段的意思是使用名为curEmployee的光标,将查询出来的数据存入到_name和_address变量中。
4)关闭光标
CLOSE curEmployee;
注释:在上面使用光标的位置_name和_address这两个变量是之前定义好的,也就是在使用光标之前 就要定义好这两个变量。关闭光标了以后就不能用FETCH这个语句使用光标了。
5)通过实例演示光标在存储过程中的应用
5.1)创建存储过程
5.2)调用存储过程
CALL StarQuery69(1,12,@GetCount,@GetName,@GetAddress);
SELECT @GetCount,@GetName,@GetAddress;
5.3)执行结果
2.存储过程光标注意事项
在写上面的存储过程示例时,最初期通过光标在REPEAT中逐条查询的写法如下:
REPEAT
FETCH cur_name_address INTO _Name ,_Address;
SET NameStr=","+NameStr+_Name;
SET AddressStrs=","+AddressStrs+_Address;
UNTIL 0 END REPEAT;
这种写法,在通过call调用存储过程的时候,数据库报错,错误的大概意思翻译成中文是有重复值,后来我意识到该错误的主要原因是不能用“+”连接字符串,接下来我做了如下修改:
REPEAT
FETCH cur_name_address INTO _Name ,_Address;
SET AddressStrs=CONCAT_WS(',',AddressStrs,_Address);
SET NameStr=CONCAT_WS(',',NameStr,_Name);
UNTIL 0 END REPEAT;
该正后,再次调用存储过程,此次出现了新的错误,如下:
出现这种错误的原因是光标读到了空值,也就是数据集中的记录被读完了,知道了错误的原因后,通过查阅资料,做了如下修改:
首先定义一个变量:
declare tmpName varchar(20) default '1' ;
然后在声明光标后,加上如下代码:
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;
该代码的意思是如果数据集中的记录被读完,即光标读不到数据,那么将变量tmpname的值设置为null,此时在循环条件判断中,加上条件判断,若tmpname is null 则退出循环,即可避免该错误。但是在本文的例程中我没有使用这种办法,而是设置一个自增变量来与查询记录总数进行判断,效果基本一样。