`

解决为'MM_CURSOR' 的游标已存在问题

    博客分类:
  • WARN
阅读更多
今天写了个存储过程,使用了两个游标,在数据库里实现嵌套多层循环操作!
可是,老是执行存储过程,总是出现名为'MM_CURSOR' 的游标已存在。
一般出现这样的问题是:
1:游标没有    --关闭 释放
如:
	--关闭游标
	      CLOSE MM_CURSOR
         --释放游标
	     DEALLOCATE MM_CURSOR


2:游标已存在同名情况,此时就需要在定义游标时申明一个局部的游标
如:
	/*检索已经配置好的新村镇的所有乡级部门*/
    ---申明游标
	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'




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


	--关闭游标
	      CLOSE MM_CURSOR
         --释放游标
	     DEALLOCATE MM_CURSOR
    --关闭游标--释放游标
	CLOSE deptCursor
    --释放游标
	DEALLOCATE deptCursor


没有及时关闭导致问题出现!
正确代码如下
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











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

相关推荐

    set-double-X-Cursor-and-read.rar_cursor_labview游标_游标

    设置双游标,并且读取X轴值。需要设置属性节点-活动游标,然后在拖动添加X轴位置。这个难点很多人遇到过

    Moving-CURSOR.rar_labview_labview 波形图_labview游标_波形图_游标

    "Moving-CURSOR.rar_labview_labview 波形图_labview游标_波形图_游标"这个压缩包文件显然包含了关于如何在LabVIEW中使用游标读取波形图数据的相关内容。游标功能在分析和测量应用中非常关键,因为它允许用户直观地...

    波形图游标功能_获取游标_

    在图形用户界面中,游标通常表现为可移动的标记,用于指示数据的特定位置。在波形图中,游标可以用来读取特定时间点的信号幅度,或者同时在多个波形之间进行比较。 设置波形图的游标主要包括以下几个方面: 1. **...

    Oracle_PLSQL游标的学习

    游标可以理解为是一个映射在结果集中的一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。 游标的分类: * 显式游标:需要 4 步来使用,包括声明游标、打开游标、读取数据和关闭游标。 * ...

    fgdb_游标查找_游标实现数据库创建_

    在数据库术语中,游标(Cursor)是一个编程概念,它允许程序逐行处理数据库查询结果。游标提供了在结果集中向前或向后移动的能力,这使得我们可以按需处理每一行数据,而不是一次性加载所有结果。在Python中,通常...

    在Oracle 9i下的display_cursor脚本

    因此,`DISPLAY_CURSOR`脚本在那个时代显得尤为重要,它提供了直接查看游标状态的手段,对于数据库管理员和开发人员来说,是诊断和优化SQL性能不可或缺的工具。 总的来说,Oracle 9i的`DISPLAY_CURSOR`脚本是数据库...

    Oracle数据库游标连接超出解决方案

    oracle数据库忽然连不上了,一查是游标数量超了。 1.查看游标数 ... from v$open_cursor o, v$session s where user_name = 'AF651_U8' and o.sid = s.sid group by o.sid, osuser, machine order b

    Oracle11g教程_第8章_游标、事务和锁

    Oracle11g教程_第8章_游标、事务和锁 ppt

    sql游标 cursor

    这里,`d_cursor`被定义为一个游标,用于从`Members`表中选择`IdCardNO`列的数据。 #### 二、打开游标 在声明了游标之后,我们需要通过`OPEN`命令来激活游标,使其准备好读取数据。打开游标的语法为: ```sql ...

    SQL_SERVER游标最新详解[定义].pdf

    SQL Server中的游标是数据库操作中的一个重要工具,它允许用户逐行处理查询...虽然游标可能带来性能影响,但在某些特定场景下,它们是解决问题的关键工具。理解和掌握游标使用,可以帮助开发者更高效地与数据库交互。

    plsql.zip_PLSQL Developer_cursor

    在这个例子中,我们声明了一个名为my_cursor的显示游标,用于获取department_id为100的员工信息。然后,我们使用`OPEN`打开游标,`FETCH`提取数据,`EXIT`判断是否到达结果集末尾,`CLOSE`关闭游标。 其次,**隐式...

    GKD-BasePL_SQL游标实现关键技术.pdf

    【GKD-BasePL_SQL游标实现关键技术】 游标是数据库管理系统中的一种重要特性,它允许程序员逐行处理查询结果,而不是一次性加载所有数据。在PL/SQL(Oracle的过程化SQL语言)中,游标机制提供了对数据集的动态控制...

    mysql高级部分--包含索引建立优化_函数_存储过程_触发器_及游标

    #### 四、游标(Cursor) **定义:** 游标是用于处理查询结果集的一种机制,可以逐行读取结果集中的数据。 **用途:** - 处理大量数据时,逐行处理数据而不是一次性加载所有数据到内存。 - 实现复杂的循环逻辑。 ...

    条件控制_循环_游标.~sql

    条件控制_循环_游标.~sql

    use_default_cursor.rar_-use_cursor_DEMO

    本DEMO "use_default_cursor.rar" 提供了一个关于如何在应用程序中使用预定义光标(Default Cursor)的实例,旨在帮助开发者更好地理解和应用这一技术。 首先,我们需要理解什么是预定义光标。预定义光标是数据库...

    oralce_游标_小葵花

    标题中的“oralce_游标_小葵花”暗示了我们今天将深入探讨Oracle数据库中的一个重要概念——游标。游标在数据库编程中扮演着关键角色,尤其在处理复杂的SQL查询和事务时,它们允许我们逐行处理结果集,而不仅仅是一...

    Oralce PLSQL存储过程之游标实践!

    - `v_salary_cursor%NOTFOUND`是一个伪列,用来判断是否已到达游标的末尾。 3. **带参数的游标** 该示例展示了如何使用带有参数的游标。 ```sql DECLARE CURSOR v_salary_cursor(in_deptNo NUMBER) IS ...

    超出打开游标的最大数的原因和解决方案

    解决超出打开游标的最大数问题需要从两个方面入手:检查数据库中的 OPEN_CURSORS 参数值和获取打开的游标数。 1. 检查数据库中的 OPEN_CURSORS 参数值 要检查数据库中的 OPEN_CURSORS 参数值,可以使用以下查询: ...

    ORACLE技术文档\oracle cursor 游标.doc

    3. `session_cached_cursors`:这个参数指定Oracle服务器为每个会话缓存的预编译游标数量。缓存游标有助于提高性能,因为它减少了编译SQL语句的次数。然而,它也会占用`OPEN_CURSORS`的配额。 `cursor_space_for_...

    sql server 游标实例

    这行代码声明了一个名为`test_cursor`的游标,它将从`test`表中选择所有的`id`字段值。 2. **打开游标**: ```sql OPEN test_cursor; ``` 这行代码打开了之前声明的游标,准备从其中读取数据。 3. **获取数据...

Global site tag (gtag.js) - Google Analytics