解决为’*********’ 的游标已存在问题 – 挑战 – 博客园

来源: 解决为’*********’ 的游标已存在问题 – 挑战 – 博客园

出现名为’MM_CURSOR’ 的游标已存在。 
一般出现这样的问题是: 
1:游标没有    –关闭 释放 
如: 

SQL代码 
  1. –关闭游标
  2.       CLOSE MM_CURSOR
  3.         –释放游标
  4.      DEALLOCATE MM_CURSOR

2:游标已存在同名情况,此时就需要在定义游标时申明一个局部的游标 
如: 

SQL代码 
  1. /*检索已经配置好的新村镇的所有乡级部门*/
  2.    —申明游标
  3. DECLARE deptCursor CURSOR
  4.    local FOR
  5.    SELECT  deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,deptcharacter,caseSMSFlag,deptType
  6.    FROM t_department
  7.    where  PARENTID=250 and deptType=‘2’

其实我的情况都不是这样,只是在使用嵌套多层循环操作时把两个游标全部放在存储过程末后 

SQL代码 
  1. –关闭游标
  2.       CLOSE MM_CURSOR
  3.         –释放游标
  4.      DEALLOCATE MM_CURSOR
  5.    –关闭游标–释放游标
  6. CLOSE deptCursor
  7.    –释放游标
  8. DEALLOCATE deptCursor

没有及时关闭导致问题出现! 
正确代码如下 

Sql代码 
  1. set ANSI_NULLS ON
  2. set QUOTED_IDENTIFIER ON
  3. go
  4. —drop  PROCEDURE copyDept
  5. ALTER PROCEDURE [dbo].[copyDept]
  6.     as
  7.     declare @deptCode varchar(20)
  8.     declare @deptname varchar(10)
  9.     declare @deptsimplename varchar(100)
  10.     declare @distid bigint
  11.     declare @deptuncode varchar(100)
  12.     declare @deptqueryno varchar(100)
  13.     declare @ifreport varchar(4)
  14.     declare @deptsort int
  15.     declare @enable varchar(6)
  16.     declare @deptfloor smallint
  17.     declare @deptcharacter varchar(50)
  18.     declare @caseSMSFlag varchar(4)
  19.     declare @deptType varchar(1)
  20.     declare @DeNo bigint
  21.     set nocount on
  22.     begin
  23.     set  @deptcode = ‘2000000’
  24.     /*检索已经配置好的新村镇的所有乡级部门*/
  25.     —申明游标
  26.     DECLARE deptCursor CURSOR
  27.     local FOR
  28.     SELECT  deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,deptcharacter,caseSMSFlag,deptType
  29.     FROM t_department
  30.     where  PARENTID=250 and deptType=‘2’
  31.     —打开游标
  32.     OPEN deptCursor
  33.     –循环取出游标    
  34.     FETCH NEXT FROM deptCursor INTO @deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
  35.     while (@@FETCH_STATUS = 0)
  36.         begin
  37.             /*检索乡镇行政部门:如赵集镇,龙王乡…*/
  38.             —申明游标
  39.             Declare MM_CURSOR CURSOR
  40.             local  FOR
  41.             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
  42.             Order by DEPTCODE /**ONLY VALID DEPARTMENT */
  43.             — 打开游标
  44.             open MM_CURSOR
  45.             –循环取出游标    
  46.             FETCH NEXT FROM MM_CURSOR  INTO @DeNo
  47.             while (@@FETCH_STATUS = 0)
  48.                 BEGIN
  49.                  set @deptcode = convert(varchar(20),cast(@deptcode as int)+1)
  50.                 print(@deptcode)
  51.                  INSERT INTO T_DEPARTMENT (deptcode, deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,PARENTID,deptcharacter,caseSMSFlag,deptType)
  52.                                     VALUES (@deptcode,@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@DeNo,@deptcharacter,@caseSMSFlag,@deptType)
  53.                 FETCH NEXT FROM MM_CURSOR INTO @DeNo
  54.                 END
  55.             –关闭游标
  56.           CLOSE MM_CURSOR
  57.          –释放游标
  58.          DEALLOCATE MM_CURSOR
  59.         FETCH NEXT FROM deptCursor INTO @deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
  60.                                         –@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@deptcharacter,@caseSMSFlag,@deptType
  61.         end
  62.     end
  63.     –关闭游标
  64.     CLOSE deptCursor
  65.     –释放游标
  66.     DEALLOCATE deptCursor

此外,在刚开始调用存储过程还遇到一个问题:程序处于正在查询状态,近一个小时,我想,数据还没那么复杂,可能出现死循环或某个游标没有移动… 
可是看了代码,没有出现这样的情况, 
经同事指点: 

Sql代码 
  1. —申明游标
  2.             Declare MM_CURSOR CURSOR
  3.             local  FOR
  4.             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
  5.             Order by DEPTCODE /**ONLY VALID DEPARTMENT */
  6.             — 打开游标
  7.             open MM_CURSOR
  8.             –循环取出游标    
  9.             FETCH NEXT FROM MM_CURSOR  INTO @DeNo
  10.             while (@@FETCH_STATUS = 0)
  11.                 set @deptcode = convert(varchar(20),cast(@deptcode as int)+1)   //把此行代码移至begin代码内即可
  12.                 BEGIN
  13.                 print(@deptcode)
  14.                  INSERT INTO T_DEPARTMENT (deptcode, deptname, deptsimplename,distid, deptuncode,deptqueryno,ifreport,deptsort,enable,deptfloor,PARENTID,deptcharacter,caseSMSFlag,deptType)
  15.                                     VALUES (@deptcode,@deptname,@deptsimplename,@distid,@deptuncode,@deptqueryno,@ifreport,@deptsort,@enable,@deptfloor,@DeNo,@deptcharacter,@caseSMSFlag,@deptType)
  16.                 FETCH NEXT FROM MM_CURSOR INTO @DeNo
  17.                 END
  18.             –关闭游标
  19.           CLOSE MM_CURSOR
  20.          –释放游标
  21.          DEALLOCATE MM_CURSOR
分享到:更多 ()