oracle 的pl/sql的(树型结构的题)。
例如表:test_func
code codeName superId superName isref
000 北京一小学 0 北京市教育局 0
000001 一年级 000 北京一小学 0
000001101 一年级一班 000001 一年级 1
000001102 一年级二班 000001 一年级 1
000001103 一年级三班 000001 一年级 1
000002 二年级 000 北京一小学 0
000001201 二年级一班 000002 二年级 1
000001202 二年级二班 000002 二年级 1
000001203 二年级三班 000002 二年级 1
000003 三年级 000 北京一小学 0
000001301 三年级一班 000003 三年级 1
000001302 三年级二班 000003 三年级 1
000001303 三年级三班 000003 三年级 1
000004 四年级 000 北京一小学 0
000004401 四年级一班 000004 四年级 1
求一个插入函数:比如插入(000001104 一年级四班 000001 一年级)这样一条记录,则会插入在记录(000001103 一年级三班 000001 一年级)下面,而不是插入在其它地方。(isref代表是否叶子结点:0代表否,1代表是)求一个删除函数:比如删除了记录(000004401 四年级一班 000004 四年级 1)
则上面的记录(000004 四年级 000 北京一小学 0)的isref变为1,变成了非
叶子结点了
例如表:test_func
code codeName superId superName isref
000 北京一小学 0 北京市教育局 0
000001 一年级 000 北京一小学 0
000001101 一年级一班 000001 一年级 1
000001102 一年级二班 000001 一年级 1
000001103 一年级三班 000001 一年级 1
000002 二年级 000 北京一小学 0
000001201 二年级一班 000002 二年级 1
000001202 二年级二班 000002 二年级 1
000001203 二年级三班 000002 二年级 1
000003 三年级 000 北京一小学 0
000001301 三年级一班 000003 三年级 1
000001302 三年级二班 000003 三年级 1
000001303 三年级三班 000003 三年级 1
000004 四年级 000 北京一小学 0
000004401 四年级一班 000004 四年级 1
求一个插入函数:比如插入(000001104 一年级四班 000001 一年级)这样一条记录,则会插入在记录(000001103 一年级三班 000001 一年级)下面,而不是插入在其它地方。(isref代表是否叶子结点:0代表否,1代表是)求一个删除函数:比如删除了记录(000004401 四年级一班 000004 四年级 1)
则上面的记录(000004 四年级 000 北京一小学 0)的isref变为1,变成了非
叶子结点了
能否解释一下下面几个帖是怎么给的分。分不是什么重要的东西,但反映了你的态度问题http://topic.csdn.net/u/20100117/20/d3f3360f-5d4c-4440-9714-84244cb26c32.html
http://topic.csdn.net/u/20100116/22/f39d5157-5192-4d43-9ad7-a980a17882ac.html
http://topic.csdn.net/u/20100117/20/b5347892-d825-4923-892e-dc7a9f5a89c7.html
插入要按顺序啊,很奇怪的需求啊,不懂为什么,只要查询显示出来的时候按顺序就可以了啊,插入无所谓,查到时候按 code 升序排列就可以了,ORDER BY code 求一个删除函数:比如删除了记录(000004401 四年级一班 000004 四年级 1)
则上面的记录(000004 四年级 000 北京一小学 0)的isref变为1,变成了非叶子
建议用触发器最好了,函数麻烦了点,先查询是否还有子节点,没有的话就更新
return number is
v_result number;
supId test_func.superId%type;
begin
--取父节点编号
select max(superId)
into supId
from test_func where code=mycode;
--查询父节点的子节点数
select count(*)
into v_result
from test_func
where superId =supId;
--如果当前只有一条记录的话,删除节点同时变为非子节点
if v_result =1 then
update test_func set isref =1 WHERE code=supId;
end if;
--删除你要删除的节点
delete from test_func where code=mycode;
COMMIT;
v_result := 1;
exception
when NO_DATA_FOUND then
v_result := -1;
when others then
v_result := -2;
DBMS_OUTPUT.PUT_LINE('在FN_GET_TAX_GB过程中出错!');
return v_result;
end UpdateNode;