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

アップデート

update さんのコラムに 2 sp (2 way) と書きましPcCodeたが、あまりうまくいっていないように思います。

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: エラー - 完了しました。しかし、それは結果 false を返します。そして、私は正しく働く方法を知りません。

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解決するか、1つの方法で2つのspよりも良くなるように助けてください。ありがとう!

4

1 に答える 1

1

並べ替え用に列を設定しているようですが、その必要はありません。また、あなたが望むように設定するクエリはPcCode非常に難しいでしょう。

このオプションを使用すると、Oracle の階層クエリは階層によってソートされ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
于 2013-08-08T04:49:42.983 に答える