2013-08-08 4 views
0

에서 계층 구조의 열이 나는 service '아래의 테이블 : service업데이트 오라클

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

그리고 데이터'가의 테이블 :

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' 
..... 

업데이트는

나는 열 PcCode의 업데이트에 대한 2 SP (2 방법)을 작성했습니다,하지만 난 그게 아주 좋은 일을하지 생각. 오류 - 그것은 끝났어 :

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 것보다 더 나은 해결하기 위해 도와주세요. 감사!

답변

1

정렬을 위해 열을 설정 한 것처럼 보일 필요가 없습니다. 또한 쿼리를 PcCode과 같이 설정하는 것은 매우 어려울 것입니다.

ORDER SIBLINGS BY 옵션을 사용하면 오라클의 계층 적 쿼리가 계층 구조별로 정렬됩니다. 다음 쿼리는 계층 구조를 읽고 원하는대로 정렬합니다 (각 행의 전체 계층 구조 분기를 표시하는 "경로"값을 추가했으며 정확히 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 
+0

감사합니다, 그것은 매우 유용합니다. 그러나 결과를 내 결과로 얻고 싶습니다. – LazyCatIT