数据库基础篇(二)存储过程中光标的使用

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 则退出循环,即可避免该错误。但是在本文的例程中我没有使用这种办法,而是设置一个自增变量来与查询记录总数进行判断,效果基本一样。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值