ORACLE如何找出视图依赖的对象和视图嵌套层数

这篇具有很好参考价值的文章主要介绍了ORACLE如何找出视图依赖的对象和视图嵌套层数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前写过一篇文章“SQL Server如何找出视图依赖的对象和视图嵌套层数”,这里我介绍一下Oracle数据库中如何找出视图的依赖对象以及视图嵌套层数关系。主要通过DBA_DEPENDENCIES这个系统视图(这个系统视图中包含有对象的依赖关系数据)。另外,我们使用了Oracle的树形查询(层级查询)来展示这种层级关系。对比SQL Server数据库与Oracle数据库的SQL来说,感觉Oracle由于拥有非常给力的系统函数,感觉写出来的SQL更优雅与简洁。如果你对代码简洁优雅有股执着与偏执的话。就会有这样的感觉。

--==================================================================================================================
--        ScriptName            :            get_view_referenced_objects.sql
--        Author                :            潇湘隐者    
--        CreateDate            :            2018-08-03
--        Description           :            查看视图引用的对象
--        Note                  :             
/*-*****************************************************************************************************************
        Parameters              :                                    参数说明
********************************************************************************************************************
            &OWNER              :            视图的OWNER
            &VIEW_NAME          :            视图的名称
********************************************************************************************************************
   Modified Date    Modified User     Version                 Modified Reason
********************************************************************************************************************
    2018-08-03        潇湘隐者         V01.00.00        新建该脚本。
*******************************************************************************************************************/

SELECT  V.ROW_LEVEL
       ,V.OBJECT_OWNER
       ,V.OBJECT_NAME
       ,V.OBJECT_TYPE
       ,V.REFERENCED_OWNER
       ,V.REFERENCED_NAME
       ,O.OBJECT_TYPE  AS REFERENCED_OBJECT_TYPE
FROM
(
SELECT LEVEL                AS ROW_LEVEL
      ,D.OWNER              AS OBJECT_OWNER
      ,D.NAME               AS OBJECT_NAME
      ,D.TYPE               AS OBJECT_TYPE
      ,D.REFERENCED_OWNER   AS REFERENCED_OWNER
      ,D.REFERENCED_NAME    AS REFERENCED_NAME
FROM DBA_DEPENDENCIES D 
START WITH D.OWNER=UPPER('&OWNER'AND D.NAME =UPPER('&VIEW_NAME'AND D.TYPE='VIEW'
CONNECT BY NOCYCLE PRIOR D.REFERENCED_OWNER = D.OWNER
               AND PRIOR  D.REFERENCED_NAME =D.NAME
) V
INNER JOIN DBA_OBJECTS O ON V.REFERENCED_OWNER =O.OWNER AND V.REFERENCED_NAME=O.OBJECT_NAME
ORDER BY V.ROW_LEVEL,V.OBJECT_OWNER,V.OBJECT_NAME;

这个脚本虽然展示了视图依赖对象的关系,但是感觉还是不够直观,我想将视图依赖的对象用>>这种链条关系给直观的展示出来,所以有了下面脚本。

--==================================================================================================================
--        ScriptName            :            get_view_referenced_objects.sql
--        Author                :            潇湘隐者    
--        CreateDate            :            2021-06-15
--        Description           :            查看视图引用的对象
--        Note                  :            此脚本get_view_referenced_objects.sql的第二个版本。
/*-*****************************************************************************************************************
        Parameters              :                                    参数说明
********************************************************************************************************************
            &OWNER              :            视图的OWNER
            &VIEW_NAME          :            视图的名称
********************************************************************************************************************
   Modified Date    Modified User     Version                 Modified Reason
********************************************************************************************************************
    2018-08-03        潇湘隐者         V01.00.00        新建该脚本。
*******************************************************************************************************************/


SELECT LEVEL                AS ROW_LEVEL
      ,D.OWNER              AS OBJECT_OWNER
      ,D.NAME               AS OBJECT_NAME
      ,D.TYPE               AS OBJECT_TYPE
      ,PRIOR(D.OWNER ||'.' || D.NAME) 
                            AS PARNET_OBJECT_NAME
      ,sys_connect_by_path(D.OWNER ||'.' ||D.NAME,'>>'
       || '>>' || D.REFERENCED_OWNER || '.' ||  D.REFERENCED_NAME AS NESTED_VIEW_PATH
      ,D.REFERENCED_OWNER   AS REFERENCED_OWNER
      ,D.REFERENCED_NAME    AS REFERENCED_NAME
FROM DBA_DEPENDENCIES D 
START WITH D.OWNER=UPPER('&OWNER'AND D.NAME =UPPER('&VIEW_NAME'AND D.TYPE='VIEW'
CONNECT BY NOCYCLE PRIOR D.REFERENCED_OWNER = D.OWNER
               AND PRIOR D.REFERENCED_NAME =D.NAME
ORDER BY ROW_LEVEL, OBJECT_OWNER, OBJECT_NAME;

其实我写这个SQL的目的是将数据库中嵌套超过1层的视图给找出来,嵌套层数过多的视图对SQL性能来说往往是一个灾难,而且是仅仅灾难的开始,而且嵌套视图也是SQL性能优化中一个很头疼的问题。如果你能杜绝这种现象,最好将其扼杀在萌芽状态,如果你无法杜绝的话,性能优化中,你会经常与其打交道。那么问题来了,一个数据库里面如果存在视图嵌套视图或者说嵌套超过2层的视图,我们如何将其找出来呢? 这里分析一个我写的脚本,简单测试过了,应该没有什么问题,如有问题,欢迎反馈指教。

注意:这个SQL只是找出视图的嵌套关系,如果要找出嵌套2层或超过2层的视图,加上一个查询条件即可。这里不做展开赘述了文章来源地址https://www.toymoban.com/news/detail-480894.html

--==================================================================================================================
--        ScriptName            :            get_netsted_view_level.sql
--        Author                :            潇湘隐者    
--        CreateDate            :            2023-06-01
--        Description           :            查看/找出数据库视图嵌套视图信息(例如嵌套层数/嵌套层次关系)
--        Note                  :            这里使用了一个中间表T_OBJECT_DEPENDENCIES存储数据,主要原因是因为直接查询DBA_DEPENDENCIES
--                                           的SQL性能非常差.
/*-*****************************************************************************************************************
        Parameters              :                                    参数说明
********************************************************************************************************************
                                :            无参数
********************************************************************************************************************
   Modified Date    Modified User     Version                 Modified Reason
********************************************************************************************************************
    2023-06-01        潇湘隐者         V01.00.00        新建该脚本。
*******************************************************************************************************************/

DROP TABLE T_OBJECT_DEPENDENCIES PURGE;
CREATE TABLE T_OBJECT_DEPENDENCIES
AS
SELECT * FROM DBA_DEPENDENCIES 
WHERE OWNER NOT IN ('SYS','SYSTEM''OLAPSYS''PUBLIC''CTXSYS''DVSYS','APEX_040200''AUDSYS'
                    ,'WMSYS','XDB''LBACSYS','LBACSYS''MDSYS''IC_ADMIN','GSMADMIN_INTERNAL''DBSNMP'
                   );


WITH NESTED_VIEW  AS 
(
SELECT LEVEL                AS ROW_LEVEL
      ,D.OWNER              AS OBJECT_OWNER
      ,D.NAME               AS OBJECT_NAME
      ,D.TYPE               AS OBJECT_TYPE
      ,PRIOR(D.OWNER ||'.' || D.NAME) 
                            AS PARNET_OBJECT_NAME
      ,sys_connect_by_path(D.OWNER ||'.' ||D.NAME,'>'AS NestViewPath
      ,D.REFERENCED_OWNER   AS REFERENCED_OWNER
      ,D.REFERENCED_NAME    AS REFERENCED_NAME
FROM T_OBJECT_DEPENDENCIES D 
START WITH  D.TYPE='VIEW' 
CONNECT BY NOCYCLE PRIOR D.REFERENCED_OWNER =D.OWNER
               AND PRIOR D.REFERENCED_NAME =D.NAME
)
SELECT DISTINCT SUBSTR(NestViewPath, 2DECODE(INSTR(NestViewPath, '>',1,2), 0,  LENGTH(NestViewPath)-1INSTR(NestViewPath, '>',1,2)-2)) AS PARENT_OBJ_NAME,
       NestViewPath ||'>' ||REFERENCED_OWNER ||'.' || REFERENCED_NAME AS NestViewPath,
       REFERENCED_NAME, ROW_LEVEL   
FROM  NESTED_VIEW
ORDER BY 1;
DROP TABLE T_OBJECT_DEPENDENCIES PURGE;

到了这里,关于ORACLE如何找出视图依赖的对象和视图嵌套层数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Oracle 的视图

    源数据: ps: 所有的视图的是基于基表的数据,相当于引用那个表的数据,当普通视图的值发生改变时,则基表值也会改变,反之亦然。 优点: 实时性,简化查询,安全性。 缺点: 影响性能,数据一致性(底层数据发生改变视图数据也会改变) ps:优点:性能提升,数据一致性,

    2024年02月16日
    浏览(23)
  • Oracle更新视图

    要了解是否可以修改固有可更新视图的列以及可以修改的方式,请查询 USER_UPDATABLE_COLUMNS 数据字典视图. 附带视图简介 视图是可在数据库中创建的已保存的查询。 单个视图可以引用一个或多个表。 而且,与表一样,视图由数据行和列组成。 可以使用视图作为查询源,其方式

    2024年02月16日
    浏览(17)
  • Oracle中的视图

    视图是一个虚拟表 视图是由sql查询语句产生的 视图真实存在 但是不存储数据 视图中的数据 只是对 基表(源数据表) 中的数据的引用 总的来说 视图可以简化数据 用户,订单,物流 三个表进行关联 吧很复杂的sql查询语句存储成一个视图  获取结果就可以直接查询视图 不用再

    2024年04月26日
    浏览(15)
  • ORACLE实时SQL监控视图

           实时的SQL监控(Real Time SQL Monitoring)是Oracle 11g的一个新特性,它是一项强大的工具,用于监视和分析正在执行的SQL语句的性能和执行计划。该功能允许我们实时地跟踪SQL查询的执行过程,以及了解其资源消耗、等待事件和执行计划等关键指标。         在当今

    2024年02月16日
    浏览(34)
  • Oracle创建用户、授权视图权限

    1、创建用户密码 2、授权 3、创建视图 4、最终查询 5、回收表或视图权限

    2024年02月09日
    浏览(31)
  • oracle创建视图 并分配用户

    创建视图 create view VI_BR_SURGICAL_INFO(视图名) as select a.BRID,a.BRXM,a.HISSQDH,VISIT_ID,b.SSMC as opm_oprt_name ,b.SSDM as opm_oprt_code, a.MZFF as anst_way,a.MZYS as anstdr_code, a.SSYS as oper_dr_code ,a.OPER_BEGIN as opm_oprt_begntime ,a.OPER_END as opm_oprt_endtime , a.ANES_BEGIN as anst_begntime,a.ANES_END as anst_endtime,a.ssid, b.jlxh a

    2024年02月06日
    浏览(28)
  • Oracle系列十二:视图、记录、同义词、序列

    (1)基本概念 Oracle视图是数据库中的一种特殊对象,它是一个虚拟的表,不存储数据,而是基于一个或多个表的查询结果而创建的。视图可以看作是一个 存储在数据库中的查询结果集 ,具有表的特性,包含一系列带有名称的列和行数据, 可以被查询、修改和删除 等。 视图

    2024年02月03日
    浏览(25)
  • Comparator.comparing嵌套对象倒序以及多重条件排序

    描述:对象A内部封装对象B,根据B的字段做倒排 描述:如:先按照年龄正序,同年龄按照体重倒序。

    2024年02月16日
    浏览(30)
  • Maven添加Oracle的依赖及驱动

    上篇文章刚介绍了Oracle数据库的安装,下面小白我来配置一下项目中Maven对于Oracle的依赖。 跟之前一篇配置SQLserver的很像,由于maven中没有Oracle的jar包,所以需要自己导入。下面简单的说一下步骤。 第一步 :查看电脑中Oracle对应jdbc的jar包(Oracle安装文件夹里有)。 第二步 :

    2024年02月15日
    浏览(24)
  • MySQL、Oracle 常用SQL:建表、建视图、数据增删改查、常用condition

    删除表:DROP TABLE TABLE_NAME; 建表:CREATE TABLE TABLE_NAME(); 主键:PRIMARY KEY 不为空: NOT NULL 默认值:DEFAULT DEFAULT_VALUE MySQL、Oracle 通用样例: 注意:DATATYPE 是指 数据库的数据类型,需要修改成具体数据类型。 INT类型 自增:INT AUTO_INCREMENT 注释:COMMENT 参考案例: INT类型:不支持自

    2024年01月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包