这两天老大让我再oracle中把要替换的表被其他对象引用之处找出来,整理一份表,接到这个任务,我是一脸懵逼,怎么找?大海捞针么?问同事、查资料,自己研究,最后整理一下仅供大家参考,同时以备将来回顾。本篇只涉及表被其他数据库对象引用,不涉及外键,想寻找外键的,自己查看下面附有的链接。

首先有下列几种方式:

1、plsql工具

点击工具,找到 查找数据库对象

 

最后进入到查找页面

 

最后根据页面把要查找的 表对象或者关键词填入 文本查找   里,再在对象条件里 选择自己要筛选的条件即可筛选。但是此方法有个弊端,就是  所有者 中下拉条件太多,要筛选很多次。

2.通过sql去查询。相关sql我是网上查阅资料,无意中看到有位大哥曾经在自己的博客回答过这个问题,先推荐给大家http://53873039oycg.iteye.com/blog/2030263/。这位大哥,小弟很不好意思在此引用一下您的内容,敬请见谅。

a>正常情况(无动态SQL时)

     System/Sysdba用户,可以使用以下SQL查看:

select * from dba_dependencies  where referenced_name =upper('对象名') and owner=upper('所有者')  
普通用户可以使用以下SQL查看:

select * from all_dependencies  where referenced_name =upper('对象名')   
b>动态SQL情况

 System/Sysdba可以使用下面的SQL查询:

select name,type,text from dba_source where upper(text) like '%对象名%'  and owner=upper('所有者')  
普通用户可以使用下面的SQL查询:

select name,type,text from user_source where upper(text) like '%对象名%'   
查看所有引用表的动态sql:

   System/Sysdba用户:

select name, type, text  

  from dba_source  

 where name in (select name  

                 from dba_source  

              where upper(text) like '%对象名%'  

                 and owner = upper('所有者')  

          minus  

            select name  

              from dba_dependencies           

where referenced_name = upper('对象名')  

            and owner = upper('所有者'))  

   and owner = upper('所有者')  

 普通用户:

select name, type, text    

from user_source  

 where name in

 (select name  

        from user_source   

       where upper(text) like '%对象名%'             

     minus           

     select name   from all_dependencies                 where referenced_name = upper('对象名'))  

 
 

好啦,以上就是借鉴那位大哥的,下面奉上小弟修改的

查看所有引用表的动态sql(考虑到实际项目中有的公司可能存储过程或者函数、视图里有的使用对象名是大写有的是小写的参考):

普通用户:

select distinct name, type
  from user_source
 where name in (select a.name
                  from user_source a
                 where a.text like  '%对象名小写%' or a.TEXT like '%对象名大写%'
                 group by a.name
                minus
                select name
                  from all_dependencies
                 where referenced_name = '对象名小写' or referenced_name = '对象名大写' )
                
 

所以小编就对比动态和静态情况下sql,发现动态情况下sql中包含了静态情况下的sql,而且用了minus函数,

minus函数是什么呢?有什么作用呢?

给大家普及一下minus函数用法:

racle Minus关键字
  SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃。
好了,既然知道了minus函数的作用,那我们何不自己写个查询所有的情况(既有静态又有动态的情况)的sql呢,福利来了,那么久整理出了下面的sql,查询的结果包含了对象本身哦。此处小编采用的  UNION ALL 取并集。然后把重复的过滤掉

select distinct name,type
from (select a.name,a.TYPE
                  from user_source a
                 where a.text like  '%表名小写%' or a.TEXT like '%表名大写%'
                 group by a.name,a.TYPE
                UNION ALL 
                select name,type
                  from all_dependencies
                 where referenced_name = '表名大写' or referenced_name = '表名小写') v
---------------------
作者:m0_37984249
来源:CSDN
原文:https://blog.csdn.net/m0_37984249/article/details/81097867

posted on 2018-12-26 13:14  懒懒的呐喊  阅读(1095)  评论(0编辑  收藏  举报