前一段时间,因为工作老大要求显示表之间的外键关系,研究了一下递归的方法。主要是新系统中,外键约束用的太多,经常会有数据不同步的现象发生,等到手工做同步的时候,就会报出外键不匹配的错误来。

写了一个脚本,会把当前schema中,所有的父表和字表按照顺序打印出来。因为不同的父子之间会有相同的表,同一个父表,被不同字表引用的深度又不同。所有,这个输出,只是做到父表在前,子表在后,前后紧跟的两张表,可能是同级别的,不保证前面的一定是后面的直接父表。

这个逻辑,也没有把握,希望大家给出一点意见。不过在本地,我已经手工验证了,没有发现错误。

脚本如下:

set serveroutput on;

-- Created on 2009-1-22 by EDWIN
declare
  -- Local variables here
  i integer;
  type table_level_type is table of pls_integer index by varchar2(30);
  v_table_list table_level_type;
  type table_list_type is table of varchar2(30) index by pls_integer;
  v_out_table_list table_list_type;
  v_table_name varchar2(30) := '';
  v_leve pls_integer := 0;
  cursor c_get_refered_tables is
    select distinct t.table_name
    from sys.user_constraints t
    where t.constraint_type = 'R'
    order by t.table_name;
  cursor c_get_parent_tables(p_table_name varchar2) is
    select t.parent_table_name, level
    from (
      select
        distinct
        a.table_name table_name,
        b.table_name parent_table_name
      from
        user_constraints a,
        user_constraints b
      where
        a.owner = b.owner
      and
        a.r_constraint_name = b.constraint_name
      and
        a.constraint_type = 'R'
      order by
        a.table_name) t
    connect by NOCYCLE t.table_name = PRIOR t.parent_table_name
    start with t.table_name = p_table_name
    order by level desc;
 
begin
  -- Test statements here
  i := 0;
  for c_tables in c_get_refered_tables loop
    v_table_name := c_tables.table_name;
   
    for c_parent_tables in c_get_parent_tables(v_table_name) loop
      if (false = v_table_list.exists(c_parent_tables.parent_table_name)) then
        i := i + 1;
        v_table_list(c_parent_tables.parent_table_name) := c_parent_tables.level;
        v_out_table_list(i) := c_parent_tables.parent_table_name;
      end if;
    end loop; -- end loop of parent tables.
   
    -- check itself.
    if (false = v_table_list.exists(v_table_name)) then
      i := i + 1;
      v_table_list(v_table_name) := 1;
      v_out_table_list(i) := v_table_name;
    end if;
   
  end loop; -- end loop of refered table list.
 
  -- print the table list.
  for i in v_out_table_list.first .. v_out_table_list.last loop
    dbms_output.put_line(v_out_table_list(i));
  end loop;
end;

/

加上一个查看指定表的所有子表的查询:

select level, lpad('  ',(level-1)*4) || t.table_name table_name
from (
  select
    distinct
    a.table_name table_name,
    b.table_name parent_table_name
  from
    user_constraints a,
    user_constraints b
  where
    a.owner = b.owner
  and
    a.r_constraint_name = b.constraint_name
  and
    a.constraint_type = 'R'
  order by
    a.table_name) t
connect by NOCYCLE PRIOR t.table_name = t.parent_table_name
start with t.parent_table_name = 'XXXX'
order by level asc;

ORACLE的递归查询相关推荐

  1. 关于oracle的递归查询

    关于oracle的递归查询 oracle的递归查询只能在查询单表时有效:若有表关联时,则无效,比如: SELECT u.*   FROM t_user u, t_duty d, t_organizat ...

  2. Oracle数据库递归查询

    Oracle数据库递归查询 最近在做一个树状编码管理系统,其中用到了oracle的树状递归查询(关键字:SELECT - WHERE- START WITH - CONNECT BY PRIOR) 以 ...

  3. oracle循环递归查询,Oracle 递归查询的用法

    Oracle数据库中常要处理一些父子关系的记录,在OLTP中要用得多一些,oracle提供了递归查询可以很容易的满足这个需求,oracle的递归查询通过start with [condition] c ...

  4. oracle 递归查询,Oracle SQL递归查询教程

    在oracle 中可以通过使用start with - connect by prior - 实现递归查询.如果你对递归查询很 模糊了话,或许下面的示例将会帮助你更好的理解oracle SQL 递归查 ...

  5. oracle 中递归查询的使用

    在之前说过,在项目中经常会接触树结构的页面:所以经常后台经常会接触树结构相关的数据.经常会写关于查询某个树节点的所有子节点的方法,若使用java的for循环或者递归不但效率低又好性能.所以这回就可以用 ...

  6. Oracle 中递归查询

    转自:http://blog.sina.com.cn/s/blog_50fa47c70100h5d1.html 有这样的一个需求: 顺义区的 region_code 是 110113 ,parent_ ...

  7. oracle 逆向递归查询_[转]ORACLE递归查询

    递归数据库处理,也称为材料清单 或零件分解问题,适用于包括人力资源.制造业.金融市场和教育在内的多种应用领域.这类处理中所涉及的数据称为 树状结构 数据或 层次结构 数据.Oracle 数据库长期以来 ...

  8. oracle plsql递归查询语句,oracle with 语句实现递归查询

    Oracle with 语句可以实现如同connect by 语句一样的序列: connect by用法 使用rownum实现1到10的序列.select rownum from dual conne ...

  9. Oracle实现递归查询

    有如下表Tree: 现在要递归查询冶炼(id=2)的所有父节点和子节点: SELECT * FROM tree START WITH id = 2 CONNECT BY PRIOR pid = id ...

  10. oracle 逆向递归查询_oracle 递归查询

    connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start by cond1 connect by cond2 where cond3; ...

最新文章

  1. Linux SSH无交互式访问配置
  2. mybatis中缓存的设计与原理
  3. leetcode- 两数之和
  4. python自动化功能测试_python、selenium自动化功能测试
  5. IDC:PC时代将结束 微软谷歌是最大输家和赢家
  6. linux在芯片设计与实现,基于Linux的Atheros无线芯片网卡驱动的设计与实现
  7. (2021) 23 [持久化] I/O设备与驱动
  8. uni-app 实现微信授权登录
  9. 利用tar 通过网络拷贝数据
  10. AI又抢了人类职位,这回轮到银行销售人员了?
  11. minio获取上传文件_Springboot集成Minio实现对象存储服务
  12. 安装与配置OCS服务器时可能会出现的问题
  13. PS4蓝牙手柄分析之1
  14. 编程工具│Fiddler 抓包 mumu 模拟器详细配置步骤
  15. Rust更适合经验较少的程序员?
  16. 惊!成年蚂蚁竟然返老还童!原因居然是。。。。
  17. Python+ASAquick+PSIPred蛋白质序列特征计算,ASAquick安装调用(Linux)
  18. 【数学】定积分和不定积分的区别
  19. 火狐中无法打开google的搜索结果的解决方式
  20. vmware:end kernel panic not syncing

热门文章

  1. 薛之谦明星人物介绍html源码 html期末大作业 课程设计
  2. HikariCP配置max-lifetime
  3. 得到app文稿导出_得到app的文稿怎么下载复制导出
  4. Ganymed SSH-2 for Java系列11之SCPClient
  5. 查看文章影响因子的插件_你的pubmed又不能显示影响因子了,因为 ……
  6. 难为知己,难为敌-职场之我见
  7. 【SDK编程】LRC歌词制作工具V1.0
  8. Synchronized锁升级:无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁
  9. 解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。
  10. 什么是顶级域名、根域/二级域名、一级域名/子域名