Oracle存储过程之递归、树状结构的存储与展示

发布时间:2019-10-13编辑:脚本学堂
本文通过实例介绍oracle存储过程中的递归、树状结构的存储与展示,学习下oracle存储过程的用法,并了解下树状结构的相关知识,有需要的朋友参考下。

一, 创建表 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中开头的空格会被忽略