0

我有一个service如下表:

CREATE TABLE service
  Id number,
  Name varchar2(50),
  ParentId number,
  PcCode varchar(50);

service表的数据:

ID  NAME    PARENTID    PCCODE
1   Test1   0           Null
2   Test2   0           Null
3   Test3   1           Null
4   Test4   1           Null
5   Test5   1           Null
6   Test6   2           Null
7   Test7   2           Null
8   Test8   2           Null
9   Test9   2           Null
10  Test10  3           Null
11  Test11  3           Null

我想更新PcCode专栏。这取决于Id列和ParentId列。例子:

 Id = 1, ParentId = 0 => PcCode = '001'
 Id = 2, ParentId = 0 => PcCode = '002'

 Id = 3, ParentId = 1 => PcCode = '001001'
 Id = 4, ParentId = 1 => PcCode = '001002'
 .....

更新

我已经为 updatePcCode的专栏写了 2 sp (2 way),但我认为它做得不是很好。

Sp1: (完毕)

create or replace 
procedure service_hierarchy
is

cursor c_service
is
select * from
service d;

cursor c_parents
is
select k.parentid from
service k
group by k.parentid
order by k.parentid;

begin
   for obj1 in c_service     
    loop
      update service e set e.pccode = lpad(to_char(rownum), 3, '0') where e.parentid = service.parentid;
    end loop;

    for obj2 in c_parents     
    loop
      update service e set e.pccode = (select f.pccode from service f where f.id = obj2.parentid) || e.pccode where e.parentid = obj2.parentid;
    end loop; 
end;

Sp2: 错误 - 完成了。但它返回结果为假。而且我不知道如何正确工作。

CREATE OR REPLACE 
PROCEDURE service_hierarchy_2
(
parentId NUMBER := 0
)
IS

CURSOR v_data IS
SELECT *
FROM service
WHERE parentId = parentId;


BEGIN

    IF (parentId = 0)
    THEN

    UPDATE service  SET pccode = LPAD(ROWNUM , 3, '0')
    WHERE parentid = parentId;
    ELSE
        FOR data IN v_data
        LOOP
            UPDATE service  SET pccode = (SELECT 1 FROM service WHERE Id = parentId) || LPAD(ROWNUM , 3, '0')
            WHERE parentid = parentId;

            service_hierarchy_2(data.Id);

        END LOOP;
    END IF;

END;

请帮助我解决sp2或一种方法比顶部的 2 sp 更好。谢谢!

4

1 回答 1

1

看起来您正在设置用于排序的列,而您不需要。此外,PcCode像您想要的那样设置查询将非常困难。

ORDER SIBLINGS BY如果您使用该选项,Oracle 的分层查询将按层次结构排序。以下查询将读取您的层次结构并按照我认为您想要的方式对其进行排序(我添加了一个“路径”值来显示每一行的完整层次结构分支,以及它如何正确排序ORDER BY SIBLINGS):

SELECT
  ID,
  Name,
  ParentID,
  SYS_CONNECT_BY_PATH(ID, '/')
FROM service
START WITH ParentID = 0
CONNECT BY PRIOR ID = ParentID
ORDER SIBLINGS BY ID;

当我运行这个查询时,我得到了以下结果:

ID NAME     PARENTID  SYS_CONNECT_BY_PATH(ID,'/')
-- -------- --------  ---------------------------
 1 Test1           0  /1
 3 Test3           1  /1/3
10 Test10          3  /1/3/10
11 Test11          3  /1/3/11
 4 Test4           1  /1/4
 5 Test5           1  /1/5
 2 Test2           0  /2
 6 Test6           2  /2/6
 7 Test7           2  /2/7
 8 Test8           2  /2/8
 9 Test9           2  /2/9
于 2013-08-08T04:49:42.983 回答