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,变成了非
叶子结点了

解决方案 »

  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
      

  2.   

    求一个插入函数:比如插入(000001104 一年级四班      000001    一年级)这样一条记录,则会插入在记录(000001103  一年级三班      000001    一年级)下面,而不是插入在其它地方。(isref代表是否叶子结点:0代表否,1代表是) 
    插入要按顺序啊,很奇怪的需求啊,不懂为什么,只要查询显示出来的时候按顺序就可以了啊,插入无所谓,查到时候按 code 升序排列就可以了,ORDER BY  code 求一个删除函数:比如删除了记录(000004401  四年级一班      000004    四年级        1) 
    则上面的记录(000004    四年级          000        北京一小学    0)的isref变为1,变成了非叶子
    建议用触发器最好了,函数麻烦了点,先查询是否还有子节点,没有的话就更新 
      

  3.   

    CREATE OR REPLACE FUNCTION UpdateNode(mycode IN test_func.code%type)
    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;