iT邦幫忙

0

初學plsql 疑問


每一個子節點有相對的一個父節點
而我下了遞回查詢的語法如下:

select *
from pwp_menu

start with PARENT_ID is null

connect by prior NODE_ID=PARENT_ID

跑出如上圖所示
請問有辦法利用plsql開發出後端資料庫已經跑好父階子階的資料表嗎?

看更多先前的討論...收起先前的討論...
有點不懂你想跑出什麼樣的結果?
主ID 子ID
0 1
0 2
0 3
1 4
1 5
1 6
.............
這樣子嗎??
像是這樣子 但有三層
來這裡問關於資料庫的問題,首先要把你的Table結構:
CREATE TABLE xxx (
id ....
);
範例資料,
想要達到的結果,完整描述出來.
mnchi830223提到:

select *
from pwp_menu
start with PARENT_ID is null
connect by prior NODE_ID=PARENT_ID


改成
select *
from pwp_menu
start with NODE_ID = 120906
connect by prior NODE_ID=PARENT_ID

試看看

參考網路文章
如果用寫預存程式的方式
create or replace PROCEDURE find_tree (userid in NUMBER,fid in NUMBER,gid in NUMBER) is

cursor c is
select node_id from pwp_menu where parent_id is null and user_id =userid ;

cursor c1 is
select node_id from pwp_menu where parent_id =fid;

cursor c2 is
select node_id from pwp_menu where parent_id=gid;

BEGIN

for ct in c LOOP
if getchild(A)>0 THEN

for ct2 in c1 loop
if getchild(A)=1 THEN
C1.NODE_ID=fid;
end if;
for ct3 in c2 loop
if getchild(A)=2 THEN
C2.NODE_ID=GID
end if
end loop;
COMMIT;
END;



CREATE OR REPLACE FUNCTION getchild (NODEID NUMBER) RETURN Number IS
gCNT NUMBER;

Begin
select COUNT(1) INTO gCNT from pwp_menu where parent_id=NODEID;
reture gCNT;

END getchild;

迴圈這裡我搞不定

1 個回答

0
Albert
iT邦高手 1 級 ‧ 2016-01-29 21:51:08

mnchi830223提到:
請問有辦法利用plsql開發出後端資料庫已經跑好父階子階的資料表嗎?

終於看懂你的問題
一般來說
很多人都是以為敲進去的順序
會是下SELECT 的顯示順序
其實是沒有順序的除非你下ORDER BY
(已經跑好父階子階的資料表)
我們用 Recursive_Read procedure
去跑出父子階順序確認時會上 Sequence_ID
下 SELECT * FROM AD_Menu ORDER BY Sequence_ID;

所以我用你說的方法 去寫一個procedure嗎?

Albert iT邦高手 1 級 ‧ 2016-01-30 21:36:12 檢舉

是的
自我呼叫去初下一層

create or replace PROCEDURE find_tree (userid in NUMBER,fid in NUMBER,gid in NUMBER) is

cursor c is
select node_id from pwp_menu where parent_id is null and user_id =userid ;

cursor c1 is
select node_id from pwp_menu where parent_id =fid;

cursor c2 is
select node_id from pwp_menu where parent_id=gid;

BEGIN

for ct in c LOOP
if getchild(A)>0 THEN

for ct2 in c1 loop
if getchild(A)=1 THEN
C1.NODE_ID=fid;
end if;
for ct3 in c2 loop
if getchild(A)=2 THEN
C2.NODE_ID=GID
end if
end loop;
COMMIT;
END;

CREATE OR REPLACE FUNCTION getchild (NODEID NUMBER) RETURN Number IS
gCNT NUMBER;

Begin
select COUNT(1) INTO gCNT from pwp_menu where parent_id=NODEID;
reture gCNT;

END getchild;

現在卡在迴圈那不知道如何寫

我要發表回答

立即登入回答