全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:951
推到 Plurk!
推到 Facebook!

游标递归的存储过程错误?

缺席
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-16 17:42:30 IP:218.80.xxx.xxx 未訂閱
存储过程如下:我用递归调用可惜运行错误“名为 'Bom_N' 的游标已存在。”,请教是什么原因?  
create procedure BOMSpread    
 @ItemA ItemCode,@Qty Qty      --WITH ENCRYPTION    
as  
begin  
  delete from BomTemp
  declare @FatherItem ItemCode,@Item ItemCode,@RequireQty Qty      DECLARE Bom_N CURSOR  for select FatherItem,Item,RequireQty from Bom where FatherItem=@ItemA         OPEN Bom_N      FETCH NEXT FROM Bom_N  INTO @FatherItem, @Item, @RequireQty      WHILE @@FETCH_STATUS = 0
  BEGIN         insert into BomTemp (FatherItem, Item, RequireQty,       BomQty)
                    values(@FatherItem,@Item,@RequireQty*@Qty, @RequireQty)  
     exec  BOMSpread @Item,@RequireQty
     FETCH NEXT FROM Bom_N  INTO @FatherItem, @Item, @RequireQty
     if @@FETCH_STATUS<>0
        RETURN 
  END
  CLOSE Bom_N
  DEALLOCATE Bom_N
end
 
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-17 23:44:06 IP:61.62.xxx.xxx 未訂閱
hi, cursor 並非是區域變數, 並不是存在於你的 stored procedure 中而已, 而是存在於 connection 中, 所以使用遞歸(recursive)呼叫你的stored procedure 時, 同樣 cursor 的名稱僅能產生一次哦!! 解決之道可能在於將此 recursive 的結構展開, 改為非 recursive 呼叫!
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-19 19:52:15 IP:218.90.xxx.xxx 未訂閱
 
create procedure BOMSpread      
@ItemA ItemCode, @Qty Qty, @OrderID OrderID,@OrdLnNo smallint,@ItemLevel int  
  
--WITH ENCRYPTION      
as    
begin    
  declare @FatherItem ItemCode,@Item ItemCode,@RequireQty Qty  
  DECLARE Bom_N CURSOR forward_only local  for   
   select FatherItem,Item,RequireQty from Bom where FatherItem=@ItemA     
  
  OPEN Bom_N  
  
  
  FETCH NEXT FROM Bom_N  INTO @FatherItem, @Item, @RequireQty     
  WHILE @@FETCH_STATUS = 0  
  BEGIN  
     insert into BomTemp (OrderID,OrdLnNo,FatherItem, Item, RequireQty,       BomQty      ,ItemLevel ,Status)--  
                   values(@OrderID,@OrdLnNo,@FatherItem,@Item,@RequireQty*@Qty, @RequireQty,@ItemLevel, 'N') --  
  
     select @ItemLevel=@ItemLevel 1  请问我想得到Item的层次应该怎么解决?
     exec  BOMSpread @Item , @RequireQty, @OrderID ,@OrdLnNo,@ItemLevel 
  
     FETCH NEXT FROM Bom_N  INTO @FatherItem, @Item, @RequireQty  
   
     if @@FETCH_STATUS<>0  
     begin  
        RETURN   
     end  
  END  
  CLOSE Bom_N  
  DEALLOCATE Bom_N  
end  
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-19 19:55:29 IP:218.90.xxx.xxx 未訂閱
以上计算出来层次@itemlevel为直接累加,而没判断层次关系,请教该怎么解决?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-19 21:41:37 IP:61.62.xxx.xxx 未訂閱
若是要知道層次, 可以利用一個系統變環境變數 @@NESTLEVEL 來取得該 sp 被呼叫的層次!!    @@NESTLEVEL 傳回現行預存程序執行的巢狀層次 (初始值為 0)。
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-19 21:56:21 IP:218.90.xxx.xxx 未訂閱
大大,能不能在我上面的代码里提示一下,谢谢,不太明白你的意思呀
系統時間:2024-11-23 13:05:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!