一, 创建表 article
复制代码 代码示例:
create table article
(
id number primary key,
cont varchar2(4000),
pid number,
isleaf number(1), -- 0, 叶子结点; 1, 非叶子结点
alevel number(2)
);
二, 插入测试数据
复制代码 代码示例:
insert into article values(1, '蚂蚁大战大象', 0, 0, 0);
insert into article values(2, '大象被打趴下了', 1, 0, 1);
insert into article values(3, '蚂蚁也不好过', 2, 1, 2);
insert into article values(4, '瞎说', 2, 0, 2);
insert into article values(5, '没有瞎说', 4, 1, 3);
insert into article values(6, '怎么可能', 1, 0, 1);
insert into article values(7, '怎么没有可能', 6, 1, 2);
insert into article values(8, '可能性是很大的', 6, 1, 2);
insert into article values(9, '大象进医院了', 2, 0, 2);
insert into article values(10, '护士是蚂蚁', 9, 1, 3);
三, 树状结构
1-蚂蚁大战大象
2-大象被打趴下了 => 1
3-大象被打趴下了 => 2
4-瞎说 => 2
5-没有瞎说 => 4
9-大象进医院了 => 2
10-护士是蚂蚁 => 9
6-怎么可能 => 1
7-怎么没有可能 => 6
8-可能性是很大的 => 6
四, 使用存储过程 展示
1, 创建
复制代码 代码示例:
create or replace procedure p
(v_pid article.pid%type, v_level binary_integer)
is
cursor c is select * from article where pid = v_pid;
v_preStr varchar2(1024) := '';
begin
-- 缩进
for i in 1..v_level loop
v_preStr := v_preStr || '* ';
end loop;
for v_article in c loop
dbms_output.put_line(v_preStr || v_article.id || '-' || v_article.cont || '=>' || v_article.pid);
-- 如果不是叶子结点, 则递归
if (v_article.isleaf = 0) then
p (v_article.id, v_level + 1);
end if;
end loop;
end;
2, 执行
复制代码 代码示例:
SQL> exec p(0,0);
1-蚂蚁大战大象=>0
* 2-大象被打趴下了=>1
* * 3-蚂蚁也不好过=>2
* * 4-瞎说=>2
* * * 5-没有瞎说=>4
* * 9-大象进医院了=>2
* * * 10-护士是蚂蚁=>9
* 6-怎么可能=>1
* * 7-怎么没有可能=>6
* * 8-可能性是很大的=>6
3, 注意
oracle中开头的空格会被忽略