iT邦幫忙

0

初學plsql 疑問

mnchi830223 1 年前1643 瀏覽


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

select *
from pwp_menu

start with PARENT_ID is null

connect by prior NODE_ID=PARENT_ID

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

看更多先前的討論...收起先前的討論...
老鷹(eagle) iT邦高手 1 級 ‧ 1 年前 檢舉
有點不懂你想跑出什麼樣的結果?
主ID 子ID
0 1
0 2
0 3
1 4
1 5
1 6
.............
這樣子嗎??
mnchi830223 iT邦新手 5 級 ‧ 1 年前 檢舉
像是這樣子 但有三層
一級屠豬士 iT邦高手 1 級 ‧ 1 年前 檢舉
來這裡問關於資料庫的問題,首先要把你的Table結構:
CREATE TABLE xxx (
id ....
);
範例資料,
想要達到的結果,完整描述出來.
海綿寶寶 iT邦超人 1 級 ‧ 1 年前 檢舉
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

試看看

參考網路文章
mnchi830223 iT邦新手 5 級 ‧ 1 年前 檢舉
如果用寫預存程式的方式
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 級 ‧ 1 年前

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

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

mnchi830223 iT邦新手 5 級 ‧ 1 年前 檢舉

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

Albert iT邦高手 1 級 ‧ 1 年前 檢舉

是的
自我呼叫去初下一層

mnchi830223 iT邦新手 5 級 ‧ 1 年前 檢舉

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;

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

我要發表回答

立即登入回答