请教:一个递归的存储过程中使用游标的问题??

eteok 2003-05-09 02:51:08
CREATE PROCEDURE Pro_getSubFolder
@folderID int
AS
declare @cursorID int
declare @childerID int
Declare folderID_cursor Cursor
For Select folderID from FileFolder where FaFolderID = @folderID
Open folderID_cursor
Fetch Next From folderID_cursor into @cursorID
While @@Fetch_Status = 0
Begin
Print @cursorID
select @childerID=[dbo].fn_GetChilder(@cursorID) //获取子节点编号
if @childerID is not null
begin
print @childerID
Close folderID_cursor
Deallocate folderID_cursor
exec Pro_getSubFolder @childerID //递归
end
Fetch Next From folderID_cursor into @cursorID //21行
End
Close folderID_cursor //23行
Deallocate folderID_cursor //24行
GO

这个存储过程我是想从上到下遍历一个树形结构,将目录的编号显示出来,其中[dbo].fn_GetChilder()函数功能是取得下级节点编号。
问题就是在遍历了第一个树枝后,也就是把一个节点的子节点全部显示出来后,就出现错误了,错误的原因是21、23、24行:名为 'folderID_cursor' 的游标不存在。
...全文
49 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
szyws 2003-05-10
  • 打赏
  • 举报
回复
根本就可以不需要用游标,while 加上一个 goto
---游标是最慢的东东千万别用!!!
CrazyFor 2003-05-09
  • 打赏
  • 举报
回复
你参考一下我的:

CREATE FUNCTION FN_32GetSubClass (@InputId int,@IdStr varchar(8000)='',@LevelCount int=-1)
/*
参数: @InputId,被搜索子类的ID
@IdStr,一个特殊参数,用于在递归中传数据,注意:调用函数时一定要传入‘’空值
@LevelCount 用于判断是不是递归调用的最上层
*/
RETURNS Varchar(8000)
AS
BEGIN

Declare @TC_ID int,@TC_PID int,@StartLevel int,@Id32 int

if @LevelCount=-1
begin
set @StartLevel=@@NESTLEVEL
set @LevelCount=@StartLevel
end
else
set @StartLevel=-1


If @IdStr='' Set @IdStr=''''+cast(@InputId as varchar)+''''

DECLARE TreeClass CURSOR local FOR --定义游标
SELECT TC_Id,TC_PID
FROM TreeClass
where TC_PID=@InputId

OPEN TreeClass
FETCH NEXT FROM TreeClass
INTO @TC_ID,@TC_PID

WHILE @@FETCH_STATUS = 0 --循环游标,即循环当前类的弟一级子类
BEGIN
select @IdStr=@IdStr+','+''''+cast(@tC_ID as varchar)+''''

if @@NESTLEVEL<32
set @IdStr=dbo.FN_32GetSubClass (@TC_ID,@IdStr,@LevelCount) --递归。
else
set @IdStr='['+cast(@tC_ID as varchar)+']'+@IdStr


FETCH NEXT FROM TreeClass
INTO @tC_ID,@TC_PID

End

CLOSE TreeClass
DEALLOCATE TreeClass

while @StartLevel=@@NESTLEVEL and charindex(']',@IdStr)>0
begin
set @Id32=substring(@IdStr,2,charindex(']',@IdStr)-2)
set @IdStr=dbo.FN_32GetSubClass (@Id32,@IdStr,@LevelCount)
set @IdStr=replace(@IdStr,'['+cast(@Id32 as varchar)+']','')
end

Return @IdStr

END


eteok 2003-05-09
  • 打赏
  • 举报
回复
是的,还是一样的错误!
CrazyFor 2003-05-09
  • 打赏
  • 举报
回复

不会啊,还是一样的出错吗?
出错信息贴出来.
leimin 2003-05-09
  • 打赏
  • 举报
回复
you can try:
....
Declare folderID_cursor Cursor global
...
horse2902 2003-05-09
  • 打赏
  • 举报
回复
如果在声明游标与释放游标之间使用了事务结构则在结束事务时游标会自动关闭,其具体的情况如
下所示
1 声明一个游标
2 打开游标
3 读取游标
4 BEGIN TRANSATION
5 数据处理
6 COMMIT TRANSATION
7 回到步骤3
在这样的应用环境中当从游标中读取一条数据记录进行以BEGIN TRANSATION
为开头COMMIT TRANSATION 或ROLLBACK 为结束的事务处理时在程序开始运行
后第一行数据能够被正确返回经由步骤7 程序回到步骤3 读取游标的下一行此
时常会发现游标未打开的错误信息其原因就在于当一个事务结束时不管其是以COMMIT
TRANSATION 还是以ROLLBACK TRANSATION 结束MS SQL SERVER 都会自动
关闭游标所以当继续从游标中读取数据时就会造成错误
解决这种错误的方法就是使用SET 命令将CURSOR_CLOSE_ON_COMMIT 这一参数
设置为OFF 状态其目的就是让游标在事务结束时仍继续保持打开状态而不会被关闭
使用SET 命令的格式为
SET CURSOR_CLOSE_ON_COMMIT OFF
eteok 2003-05-09
  • 打赏
  • 举报
回复
CrazyFor(蚂蚁) 老兄,还是不行呢!!

怎么办啊?
CrazyFor 2003-05-09
  • 打赏
  • 举报
回复
CREATE PROCEDURE Pro_getSubFolder
@folderID int
AS
declare @cursorID int
declare @childerID int
Declare folderID_cursor Cursor local
-----------------------------------^^^^^^^^^^^
For Select folderID from FileFolder where FaFolderID = @folderID


^^^处添加local

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧