Oracle學習13:樹狀結構表的存儲和展示

在實際工作中,經常會遇到建立樹狀結構表的需求。
最常見的方式,是通過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;
/

運行即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章