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