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;
/

运行即可。

猜你喜欢

转载自blog.csdn.net/qq_36743482/article/details/79581380
今日推荐