SQL Server学习:存储过程中Cursor(游标)的使用

   SQL Server中的游标声名后,一定要显示的释放。若未释放,再次执行时,则会出现“游标XX已经存在”的异常。Open游标后,一定要显示的Close。

在存储过程中试用Cursor的示例:

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='my_sp_test' AND TYPE='P') BEGIN
	DROP PROCEDURE my_sp_test;
END;
GO
create procedure my_sp_test @i int, @outstr varchar(100) out as
declare @loginName varchar(100);
declare cur_user cursor for 
	select ESUS_LOGIN_NAME from ES_USER where ESUS_ESCO_ID='100004';
begin try
    open cur_user; -- 开启游标
    fetch next from cur_user into @loginName;
    while @@FETCH_STATUS = 0 begin
		if(@i >=10) begin
			set @outstr = 'login name: '+@loginName;
			RAISERROR (66666, -- Message id.
					   16, -- Severity,
					   1 -- State,
					  ) ;	
		end else if (@i<10) begin
			set @outstr = 'login name: '+@loginName;
		end;
		fetch next from cur_user into @loginName;
    end;
    close cur_user; -- 关闭游标
	return;
end try
begin catch	
	if @@ERROR = 66666 begin
		close cur_user; -- 关闭游标
		deallocate cur_user;-- 释放游标
	end;	
	return;
end catch;
go

测试存储过程,如下代码:

/* 第一个入参= 12,不会产生异常
 */
DECLARE @OUTSTR_test VARCHAR(100);
exec dbo.my_sp_test 12,@OUTSTR_test out
print @OUTSTR_test ; 
-- @OUTSTR_test = 'login name: ryan'

/* 第一个入参= 8,执行第二次后则会出现下行的异常
 * '名为'cur_user' 的游标已存在。'
 */
DECLARE @OUTSTR_test_1 VARCHAR(100);
exec dbo.my_sp_test 8,@OUTSTR_test_1 out
print @OUTSTR_test_1 ; 
-- @OUTSTR_test_1 = 'login name: vicky'

/* 入参为8的测试语句执行第二次,之所以会出现异常,是因为没有将游标释放就return了。所以有使用游标的存储过程,在return之前一定要显示的释放游标。
 */

相关资源下载地址:  http://download.csdn.net/detail/chen_yu_ting/4233615
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值