甲骨文认证体系
Vmware认证体系
AWS亚马逊
阿里云认证体系
红帽认证体系
ZStack云计算认证体系
思科认证体系
华为认证体系
CDA数据分析师认证
达梦认证体系
麒麟
定制化课程
达梦数据库之怎么获取包含复杂视图SQL的所有依赖对象?
发布日期:2020-08-18 10:57:15阅读次数:

一、概述


在一些场景中,我们的SQL虽然看起来简单,如 select col from view1;但是可能这个 view1 是由 view2 组成,view2 是由 tab1 和 view3 组成,而view3 又是由其它若干 view组成。这样的情景下,我们构造问题SQL、重现环境时,工作量很大。头疼繁杂,笔者考虑通过自定义工具包的方法降低这类场景的复杂度,在此分享之。


注1:工具包在 20150813 的 DM7 版本上完全可用;其他版本仅供学习交流使用,烦请谨慎对待。


二、相关介绍


下面是我们要讨论的代码:


1.  CREATE OR REPLACE PACKAGE ToolPakageH1001 AS

2.      procedure too_fun_8 (v_1 in text);

3.      --依赖字串格式化显示

4.      FUNCTION TOO_FUN_7 (V_1 IN VARCHAR) RETURN TEXT;

5.      --传入SQL字串的格式化

6.      procedure too_fun_6(sch in varchar,add_view in int);

7.      --传入模式对象,返回用户依赖对象结果集合

8.      function too_fun_5 (sch in varchar,add_view in int) return text;

9.      --获取用户下所有视图的id并传给其他函数

10.     function too_fun_4(v_1 in varchar) return int;

11.     --判断字串中是否包含视图

12.     FUNCTION TOO_FUN_3 (V_1 IN VARCHAR,_view int) RETURN VARCHAR;

13.     --传入一个字串,解析完字串中的视图对象

14.     --字串格式  TEST_USER,AC01_PUB,16778391,VIEW|| TEST_USER,AC01_SI,4010,UTAB||  

15.     function too_fun_2 (v_1 in int) RETURN VARCHAR;

16.     --传入对象id,返回依赖对象字串

17.     function TOO_FUN_1 (V_1 IN VARCHAR(16)) return number;

18.     --八位字串的低高位置换

19. END ToolPakageH1001;


这段代码关键的几个地方如下:


 1. 怎么获取一个表的直接依赖对象

(比如视图 A 是由 A1  A2 创建的,这一点只管怎么由 A 获取 A1 A   2,不管 A1 A2 是否是视图——由下一点讨论)

 2. 怎么判断获取的依赖对象中仍包含视图

 3. 获取一次依赖的对象后,怎么继续处理

 4. 怎么判断获取的依赖对象中不再包含视图


其中 2 和 4 相对好处理,1 和 3 需要一定的分析。


三、使用场景两例:


1.  -- ToolPakageH1001.TOO_FUN_8(ToolPakageH1001.TOO_FUN_7(' test_user.V_AD61GROUPBYNAME'))

2.  /*

3.  使用示例1:(使用场景:查看某用户的所有非本用户的对象(表或视图

4.  ToolPakageH1001.too_fun_6('SYSDBA',0)或者 ToolPakageH1001.too_fun_6('SYSDBA',1)

5.  使用示例2:(使用场景:查看某个SQL涉及到的所有对象

6.  ToolPakageH1001.TOO_FUN_8(ToolPakageH1001.TOO_FUN_7('test_user.ac01,test_user.ab01'))

7.  下面是返回的结果集:

8.  --后来出于部分考虑,添加了一个结果集(返回视图的DDL),和另一个结果集(所有涉及表的所有索引的DDL

9.     SCH    TAB    OBJ_ID    STYPE

10.     TEST_USER    AC01_SI    4010    UTAB   

11.     TEST_USER    AB01    1694    UTAB   

12.     TEST_USER    AB01_SI    4003    UTAB   

13.     TEST_USER    AC01    1695    UTAB   

14.     TEST_USER    AB01_PUB    16778450    VIEW   

15.     TEST_USER    AC01_PUB    16778391    VIEW   

16.     TEST_USER    ABCD_VI_AB01    16778411    VIEW   

17.     TEST_USER    AC01    16778452    VIEW   

18.     TEST_USER    AB01    16778451    VIEW   

19.     之前做过其他尝试:获取所有视图的定义,编程去自己解析,这个过程实现的不好,

20.     而且繁琐。

21.     这次的尝试使用DM自带的函数,实现的比较合适。

22.     另外添加了的功能,传一个SQL进来,解析出这个SQL涉及到的所有对象。

23.     SQL select * from test_user.ac01,test_user.ab01;>test_user.ac01,test_user.ab01

24.     */


注2:由于代码量比较大,故没有在文中附上。关于工具包的详细代码、示例中所用部分建表、视图、及测试所用数据,感兴趣的话,可在公众号留言索取,会有专门人员及时联系回复。


现实场景的查询语句中若多层嵌套包含视图或表,会让原本看似简单的SQL,复杂度激增。练就火眼金睛大概也难以将涉及到的原始视图及表高效地摘出来。笔者基于工作需要自定义了这个工具包,并做了反复调整验证,分享于此,希望能让同样有此困扰的你以后可以轻松应对。


 上海腾科教育科技有限公司聚焦ICT人才培养和教育服务、培养数字化时代的新型ICT人才、促进良性的ICT人才生态发展,提供面授教育、在线教育、IT人才培养与就业、高校专业共建与实验室建设、企业人才定制培养,以及教育科技领域内的技术开发、咨询、服务以及解决方案,专注高校ICT课程课件研发、基于华为公有云的云实验实训平台建设,致力于ICT技术在高等院校的引进、开发和推广,是一家全国性的专业ICT行业技术认证服务公司。

腾科教育是华为授权的培训合作伙伴,专业提供华为ICT技术架构认证、平台与服务认证、行业服务认证等华为职业认证服务,连续多年荣获华为年度最佳合作伙伴贡献奖、华为优秀战略合作伙伴、上海HCIE精英俱乐部伙伴,连续多年举办腾科技术嘉年华华为专场,并协办华为ICT大赛、华为生态伙伴精英赛伙伴赛分赛场、华为人才双选会上海场等活动和赛事,提供面向华为生态合作伙伴和ICT学员的人才供需双选平台及ICT学员就业通道,培养ICT行业所需创新型、融合型人才。