解决为'*********' 的游标已存在问题
2017-06-23 11:27
274 查看
出现名为'MM_CURSOR' 的游标已存在。
一般出现这样的问题是:
1:游标没有 --关闭 释放
如:
Sql代码
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
2:游标已存在同名情况,此时就需要在定义游标时申明一个局部的游标
如:
Sql代码
/*检索已经配置好的新村镇的所有乡级部门*/
---申明游标
DECLARE deptCursor CURSOR
local FOR
SELECT deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,deptcharacter,caseSMSFlag,deptType
FROM t_department
where PARENTID=250 and deptType='2'
其实我的情况都不是这样,只是在使用嵌套多层循环操作时把两个游标全部放在存储过程末后
Sql代码
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
--关闭游标--释放游标
CLOSE deptCursor
--释放游标
DEALLOCATE deptCursor
没有及时关闭导致问题出现!
正确代码如下
Sql代码
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
---drop PROCEDURE copyDept
ALTER PROCEDURE [dbo].[copyDept]
as
declare @deptCode varchar(20)
declare @deptname varchar(10)
declare @deptsimplename varchar(100)
declare @distid bigint
declare @deptuncode varchar(100)
declare @deptqueryno varchar(100)
declare @ifreport varchar(4)
declare @deptsort int
declare @enable varchar(6)
declare @deptfloor smallint
declare @deptcharacter varchar(50)
declare @caseSMSFlag varchar(4)
declare @deptType varchar(1)
declare @DeNo bigint
set nocount on
begin
set @deptcode = '2000000'
/*检索已经配置好的新村镇的所有乡级部门*/
---申明游标
DECLARE deptCursor CURSOR
local FOR
SELECT deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,deptcharacter,caseSMSFlag,deptType
FROM t_department
where PARENTID=250 and deptType='2'
---打开游标
OPEN deptCursor
--循环取出游标
FETCH NEXT FROM deptCursor INTO @deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
while (@@FETCH_STATUS = 0)
begin
/*检索乡镇行政部门:如赵集镇,龙王乡...*/
---申明游标
Declare MM_CURSOR CURSOR
local FOR
Select DEPTID from t_department where ENABLE= '启用' and DISTID = 1 and deptType=0 and deptid !=250---demo,except 250 -- and PARENTID =288--and deptid not in (243,244)--and is_convenience=@tjType jc_dreaming
Order by DEPTCODE /**ONLY VALID DEPARTMENT */
-- 打开游标
open MM_CURSOR
--循环取出游标
FETCH NEXT FROM MM_CURSOR INTO @DeNo
while (@@FETCH_STATUS = 0)
BEGIN
set @deptcode = convert(varchar(20),cast(@deptcode as int)+1)
print(@deptcode)
INSERT INTO T_DEPARTMENT (deptcode, deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,PARENTID,deptcharacter,caseSMSFlag,deptType)
VALUES (@deptcode,@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@DeNo,@deptcharacter,@caseSMSFlag,@deptType)
FETCH NEXT FROM MM_CURSOR INTO @DeNo
END
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
FETCH NEXT FROM deptCursor INTO @deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
--@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
end
end
--关闭游标
CLOSE deptCursor
--释放游标
DEALLOCATE deptCursor
此外,在刚开始调用存储过程还遇到一个问题:程序处于正在查询状态,近一个小时,我想,数据还没那么复杂,可能出现死循环或某个游标没有移动...
可是看了代码,没有出现这样的情况,
经同事指点:
Sql代码
---申明游标
Declare MM_CURSOR CURSOR
local FOR
Select DEPTID from t_department where ENABLE= '启用' and DISTID = 1 and deptType=0 and deptid !=250---demo,except 250 -- and PARENTID =288--and deptid not in (243,244)--and is_convenience=@tjType jc_dreaming
Order by DEPTCODE /**ONLY VALID DEPARTMENT */
-- 打开游标
open MM_CURSOR
--循环取出游标
FETCH NEXT FROM MM_CURSOR INTO @DeNo
while (@@FETCH_STATUS = 0)
set @deptcode = convert(varchar(20),cast(@deptcode as int)+1) //把此行代码移至begin代码内即可
BEGIN
print(@deptcode)
INSERT INTO T_DEPARTMENT (deptcode, deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,PARENTID,deptcharacter,caseSMSFlag,deptType)
VALUES (@deptcode,@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@DeNo,@deptcharacter,@caseSMSFlag,@deptType)
FETCH NEXT FROM MM_CURSOR INTO @DeNo
END
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
一般出现这样的问题是:
1:游标没有 --关闭 释放
如:
Sql代码
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
2:游标已存在同名情况,此时就需要在定义游标时申明一个局部的游标
如:
Sql代码
/*检索已经配置好的新村镇的所有乡级部门*/
---申明游标
DECLARE deptCursor CURSOR
local FOR
SELECT deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,deptcharacter,caseSMSFlag,deptType
FROM t_department
where PARENTID=250 and deptType='2'
其实我的情况都不是这样,只是在使用嵌套多层循环操作时把两个游标全部放在存储过程末后
Sql代码
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
--关闭游标--释放游标
CLOSE deptCursor
--释放游标
DEALLOCATE deptCursor
没有及时关闭导致问题出现!
正确代码如下
Sql代码
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
---drop PROCEDURE copyDept
ALTER PROCEDURE [dbo].[copyDept]
as
declare @deptCode varchar(20)
declare @deptname varchar(10)
declare @deptsimplename varchar(100)
declare @distid bigint
declare @deptuncode varchar(100)
declare @deptqueryno varchar(100)
declare @ifreport varchar(4)
declare @deptsort int
declare @enable varchar(6)
declare @deptfloor smallint
declare @deptcharacter varchar(50)
declare @caseSMSFlag varchar(4)
declare @deptType varchar(1)
declare @DeNo bigint
set nocount on
begin
set @deptcode = '2000000'
/*检索已经配置好的新村镇的所有乡级部门*/
---申明游标
DECLARE deptCursor CURSOR
local FOR
SELECT deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,deptcharacter,caseSMSFlag,deptType
FROM t_department
where PARENTID=250 and deptType='2'
---打开游标
OPEN deptCursor
--循环取出游标
FETCH NEXT FROM deptCursor INTO @deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
while (@@FETCH_STATUS = 0)
begin
/*检索乡镇行政部门:如赵集镇,龙王乡...*/
---申明游标
Declare MM_CURSOR CURSOR
local FOR
Select DEPTID from t_department where ENABLE= '启用' and DISTID = 1 and deptType=0 and deptid !=250---demo,except 250 -- and PARENTID =288--and deptid not in (243,244)--and is_convenience=@tjType jc_dreaming
Order by DEPTCODE /**ONLY VALID DEPARTMENT */
-- 打开游标
open MM_CURSOR
--循环取出游标
FETCH NEXT FROM MM_CURSOR INTO @DeNo
while (@@FETCH_STATUS = 0)
BEGIN
set @deptcode = convert(varchar(20),cast(@deptcode as int)+1)
print(@deptcode)
INSERT INTO T_DEPARTMENT (deptcode, deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,PARENTID,deptcharacter,caseSMSFlag,deptType)
VALUES (@deptcode,@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@DeNo,@deptcharacter,@caseSMSFlag,@deptType)
FETCH NEXT FROM MM_CURSOR INTO @DeNo
END
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
FETCH NEXT FROM deptCursor INTO @deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
--@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
end
end
--关闭游标
CLOSE deptCursor
--释放游标
DEALLOCATE deptCursor
此外,在刚开始调用存储过程还遇到一个问题:程序处于正在查询状态,近一个小时,我想,数据还没那么复杂,可能出现死循环或某个游标没有移动...
可是看了代码,没有出现这样的情况,
经同事指点:
Sql代码
---申明游标
Declare MM_CURSOR CURSOR
local FOR
Select DEPTID from t_department where ENABLE= '启用' and DISTID = 1 and deptType=0 and deptid !=250---demo,except 250 -- and PARENTID =288--and deptid not in (243,244)--and is_convenience=@tjType jc_dreaming
Order by DEPTCODE /**ONLY VALID DEPARTMENT */
-- 打开游标
open MM_CURSOR
--循环取出游标
FETCH NEXT FROM MM_CURSOR INTO @DeNo
while (@@FETCH_STATUS = 0)
set @deptcode = convert(varchar(20),cast(@deptcode as int)+1) //把此行代码移至begin代码内即可
BEGIN
print(@deptcode)
INSERT INTO T_DEPARTMENT (deptcode, deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,PARENTID,deptcharacter,caseSMSFlag,deptType)
VALUES (@deptcode,@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@DeNo,@deptcharacter,@caseSMSFlag,@deptType)
FETCH NEXT FROM MM_CURSOR INTO @DeNo
END
--关闭游标
CLOSE MM_CURSOR
--释放游标
DEALLOCATE MM_CURSOR
相关文章推荐
- 解决为'*********' 的游标已存在问题
- 解决为'*********' 的游标已存在问题
- 解决为'*********' 的游标已存在问题
- 解决为'*********' 的游标已存在问题
- 解决为'*********' 的游标已存在问题
- 陈灯WGF双缓冲绘图框架之gdi及gdiplus实现双缓冲时存在的效率问题及解决办法
- Java使用Oracle遇到的最大游标超出问题及其解决方法
- 小波图像分解与重构程序存在的问题与解决办法
- SqlServer2000数据库迁移"用户已存在"问题解决
- 远程数据本地游标统计时无小数问题的解决
- 发现MSSQL导入数据时标识列存在的问题,已解决!
- 传统BI存在的问题及解决办法
- SERV-U使用局域网中共享文件夹作FTP文件服务(部分解决,还存在问题待解决)
- CS0433: 类型“XXXXX”同时存在于XXX.dll和YYY.dll中的问题解决
- tomcat的安装问题解决:指定的服务并未以已安装的服务存在!
- oracle9i卸载:指定的sid在本机上已经存在的问题解决
- asp.net中SqlDataReader获取数据存在的问题解决方法
- 在sps中遇到“不能添加用户,用户名已经存在”的问题的解决方法
- 今天解决了 项目中已经存在对组件“XXX”的引用 的小问题
- 用游标解决纪录合并的问题