在實際工作中,經常會遇到建立樹狀結構表的需求。
最常見的方式,是通過ID和P_ID(父ID)的方式僅存存儲,雖然可以實現,但是當我們查詢數據時,並不清晰方便。我們可以通過增加冗餘字段
- isleaf:判斷是否是葉子節點。0代表非葉子節點,1代表葉子節點。葉子節點表示沒有子節點。
- alevel:帶白等級。
如下,我們通過一個論壇帖子的方式進行理解。
有如下一個樹狀結構的帖子:
*螞蟻大戰大象
**大象被打趴下了
***螞蟻也不好過
***瞎說
****沒有瞎說
***大象僅醫院了
****護士是螞蟻
**怎麼可能
***怎麼沒有可能
***可能性還是很大的
首先我們創建一個數據表,並插入數據
--樹狀結構的存儲和展示
create table article
(
id number primary key,
cont varchar2(4000),
pid number,
isleaf number(1), --0代表非葉子節點,1代表葉子節點。葉子節點表示沒有子節點
alevel number(2)
);
insert all
into article values(1,'螞蟻大戰大象',0,0,0)
into article values(2,'大象被打趴下了',1,0,1)
into article values(3,'螞蟻也不好過',2,1,2)
into article values(4,'瞎說',2,0,2)
into article values(5,'沒有瞎說',4,1,3)
into article values(6,'怎麼可能',1,0,1)
into article values(7,'怎麼沒有可能',6,1,2)
into article values(8,'可能性還是很大的',6,1,2)
into article values(9,'大象僅醫院了',2,0,2)
into article values(10,'護士是螞蟻',9,1,3)
select 1 from dual
;
下面我們通過存儲過程進行控制檯打印顯示:
set serveroutput on;
create or replace procedure p_article_tree(p_pid article.pid%type,p_str varchar2)
AS
cursor c is select * from article where pid=p_pid;
v_str varchar2(100) default '';
begin
v_str := '*' || p_str;
for v_article in c loop
dbms_output.put_line(v_str||v_article.cont);
p_article_tree(v_article.id,v_str);
end loop;
end;
/
運行即可。