关于存储过程,紧急求助!!!!
请问各位大虾:
在写存储过程时若出现以下问题该怎么办:
定义A表其结构为:
父类,子类,其它数据
其中当记录a的子类为记录b的父类时则b为a的一个子集
如
记录a:1 2 ....
记录b:2 4 ....
则b为a的子集
当我要写一个存储过程删除一条记录时首先要删除其所有子集
但在用存储过程时同一个名称游标在某一时间只允许存在一个,
这样当我在删除如下表所示的数据中记录时我该怎么办:
记录1: 1 2 ....
记录2: 2 3 ....
记录3: 34 ....
记录4: 45 ....
记录5: 56 ....
记录6: 67 ....
记录7: 78 ....
记录8: 7 9 ....
记录8: 7 10 ....
;;; ........
记录n: ........
望各位不吝指教,注意只允许用存储过程!!!
问题点数:300、回复次数:7Top
1 楼nononono(null,null)回复于 2000-11-08 00:47:00 得分 100
题目有意思,何况这200大洋!我也奋不顾身了,请看:
CREATE procedure [dela] (@delclass char(10)) as
declare @n int, @subclass char(10)
select @n=1
while @n>0
begin
select @n=count(*)
from [tablename]
where 父類=@delclass
if @n>0
begin
select top 1 @subclass=子類
from [tablename]
where 父類=@delclass
exec dela @subclass
delete from [tablename]
where 父類=@delclass and 子類=@subclass
end
end
delete from [tablename]
where 父類=@delclass
return
Top
2 楼nononono(null,null)回复于 2000-11-08 00:50:00 得分 50
这里用到了存储过程的递归,不知你用的数据库是否允许。
这里没有用游标。
另外,程序还没有优化,效率可能不高。Top
3 楼nononono(null,null)回复于 2000-11-08 00:55:00 得分 50
才发现:我这里要删的可是指定的一个父类的所有记录。不过,可以再增加一个过程来调用这个过程,以免把一个父类的所有记录全删了(只删一个父类的指定记录)。Top
4 楼nononono(null,null)回复于 2000-11-08 08:54:00 得分 100
再给你一个比较让人担心的非递归算法,你自己加上事务吧。
CREATE procedure [delb] (@delclass char(10)) as
create table [#tmptable] (父類 char(10),子類 char(10))
declare @n int, @foundfclass char(10), @foundsclass char(10)
select @foundfclass=@delclass
select @n=1
while @n>0
begin
insert into [#tmptable]
select 父類,子類
from [tttt]
where 父類=@foundfclass
delete from [tttt]
where 父類=@foundfclass
select top 1
@foundsclass=父類, @foundfclass=子類
from [#tmptable]
delete from [#tmptable]
where 父類=@foundsclass and 子類=@foundfclass
select @n=count(*)
from [#tmptable]
end
drop table [#tmptable]
return
Top
5 楼lubj(软件小菜鸟)回复于 2000-11-08 08:55:00 得分 0
这里的删除仅是其中一个操作,关键的是我在做删除前还要做其它相关处理,这样保证数据一致性!
这样应必须要用到游标,那我该怎么办呢?Top
6 楼nononono(null,null)回复于 2000-11-08 13:44:00 得分 0
删除前的其它相关处理也应该可以参照这个非递归算法。
可以在临时表中使用一个游标。
这个非递归算法的结构是可扩充的。你仔细看了我的算法了吗?
Top
7 楼lubj(软件小菜鸟)回复于 2000-11-08 22:58:00 得分 0
谢谢!Top




