昨天下午想了一个下午,终于实现了。但是总觉得方法比较麻烦,刚开始用触发器,但是触发器不能递归,还造成了死锁,后来想自己写个递归,但技术有限,没弄出来。最后用这样的方法实现了。(函数结合存储过程) 首先,写一个函数 查询父id 不存在的记录条数。出于这样的考虑,当根据id 删除一条记录后,子节点将找不到父id 。 create or replace function F_GET_WJJ_COUNT(wjj_id NUMBER) return number is Result number; begin select count(*) into Result from k_wjj where fwjj_id not in (select distinct id from k_wjj) and fwjj_id<>0 ; return(Result); end F_GET_WJJ_COUNT; 我数据库中的表跟上面的表不太一样,但结构和内容相同。id 表示主键id ,fwjj_id 代表父id。 然后,用存储过程:
create or replace procedure K_P_DEL_WJJ(ID NUMBER) is wj_id number; begin wj_id := id ; delete from k_wjj where id = wj_id; commit; if(F_GET_WJJ_COUNT(wj_id)>0) then loop delete from k_wjj where fwjj_id not in (select distinct id from k_wjj) and fwjj_id<>0 ; commit; exit when(F_GET_WJJ_COUNT(wj_id)=0); end loop; end if; end K_P_DEL_WJJ; 功能是实现了,大家看有没有什么好的方法或者改进意见?
就你这个情况, 累不累? 用得着那么复杂吗? delete from xxx where id in (select id from xxx start with id=xxx connect by fid=prior id)
首先,写一个函数 查询父id 不存在的记录条数。出于这样的考虑,当根据id 删除一条记录后,子节点将找不到父id 。
create or replace function F_GET_WJJ_COUNT(wjj_id NUMBER) return number is
Result number;
begin
select count(*) into Result from k_wjj where fwjj_id not in (select distinct id from k_wjj) and fwjj_id<>0 ;
return(Result);
end F_GET_WJJ_COUNT;
我数据库中的表跟上面的表不太一样,但结构和内容相同。id 表示主键id ,fwjj_id 代表父id。
然后,用存储过程:
create or replace procedure K_P_DEL_WJJ(ID NUMBER) is
wj_id number;
begin
wj_id := id ;
delete from k_wjj where id = wj_id;
commit;
if(F_GET_WJJ_COUNT(wj_id)>0) then
loop
delete from k_wjj where fwjj_id not in (select distinct id from k_wjj) and fwjj_id<>0 ;
commit;
exit when(F_GET_WJJ_COUNT(wj_id)=0);
end loop;
end if;
end K_P_DEL_WJJ;
功能是实现了,大家看有没有什么好的方法或者改进意见?
累不累? 用得着那么复杂吗?
delete from xxx where id in (select id from xxx start with id=xxx connect by fid=prior id)