ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
楼主: belongmyth

[PL/SQL] 暴力方式获取存储过程中所有用到的表

[复制链接]
认证徽章
论坛徽章:
285
生肖徽章2007版:虎
日期:2014-06-23 20:17:04生肖徽章2007版:虎
日期:2014-09-18 12:50:09生肖徽章2007版:虎
日期:2014-11-14 14:21:28生肖徽章2007版:虎
日期:2014-06-23 20:42:17生肖徽章2007版:虎
日期:2014-06-23 20:42:17秀才
日期:2017-03-28 15:11:09秀才
日期:2017-03-28 15:59:38秀才
日期:2017-04-06 13:41:23秀才
日期:2017-04-06 13:42:06红宝石
日期:2017-04-06 13:47:15
11#
发表于 2014-1-13 10:54 | 只看该作者
更直观的,PL/SQL developer工具 ,点开某个存储过程下面的 references 都列出来了!

使用道具 举报

回复
论坛徽章:
4
ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34美羊羊
日期:2015-03-04 14:52:282015年新春福章
日期:2015-03-06 11:58:18
12#
发表于 2014-1-13 17:37 | 只看该作者
9i 的话正则就不行了

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上有钱
日期:2014-10-17 12:56:56处女座
日期:2015-08-30 22:09:39
13#
发表于 2014-1-13 20:29 | 只看该作者
oracle_cj 发表于 2014-1-12 23:00
select *from dba_dependencies. t where t.refer..name ='包名'

高。

使用道具 举报

回复
论坛徽章:
740
红钻
日期:2014-12-16 17:51:41布鲁克林篮网
日期:2016-09-23 08:17:18达拉斯小牛
日期:2016-09-23 08:18:15季节之章:冬
日期:2015-07-31 17:16:14ITPUB季度 技术新星
日期:2014-07-17 14:37:00华盛顿奇才
日期:2016-09-23 08:18:15季节之章:夏
日期:2015-07-31 17:16:29绿钻
日期:2015-08-15 13:20:11最佳人气徽章
日期:2015-03-19 09:44:03洛杉矶湖人
日期:2016-09-23 08:18:15
14#
发表于 2014-1-13 21:12 | 只看该作者
moseslin 发表于 2014-1-13 09:27
如果是用的动态SQL的话找不出来吧?

一般情况,这个系统视图都够用了

使用道具 举报

回复
论坛徽章:
740
红钻
日期:2014-12-16 17:51:41布鲁克林篮网
日期:2016-09-23 08:17:18达拉斯小牛
日期:2016-09-23 08:18:15季节之章:冬
日期:2015-07-31 17:16:14ITPUB季度 技术新星
日期:2014-07-17 14:37:00华盛顿奇才
日期:2016-09-23 08:18:15季节之章:夏
日期:2015-07-31 17:16:29绿钻
日期:2015-08-15 13:20:11最佳人气徽章
日期:2015-03-19 09:44:03洛杉矶湖人
日期:2016-09-23 08:18:15
15#
发表于 2014-1-13 21:12 | 只看该作者
hh7yx 发表于 2014-1-13 10:54
更直观的,PL/SQL developer工具 ,点开某个存储过程下面的 references 都列出来了!

    是滴

使用道具 举报

回复
论坛徽章:
6
2014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08优秀写手
日期:2014-02-27 06:00:02问答徽章
日期:2014-04-13 19:36:532015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
16#
发表于 2014-2-12 21:22 | 只看该作者
本帖最后由 芳林野草 于 2014-2-13 09:29 编辑

这个问题其实通过查数据字典就可以又快又好地解决:
ALL_DEPENDENCIES
ALL_DEPENDENCIES describes dependencies between procedures, packages, functions, package bodies, and triggers accessible to the current user, including dependencies on views created without any database links. This view does not display the SCHEMAID column.
Related Views
■DBA_DEPENDENCIES describes all dependencies between objects in the database. This view does not display the SCHEMAID column.
■USER_DEPENDENCIES describes dependencies between objects in the current user's schema. This view does not display the OWNER column.


存储过程、包、函数、触发器、视图、物化视图等依赖细节全都在里面。

SQL> select distinct TYPE, REFERENCED_TYPE from dba_dependencies order by 1, 2;
TYPE               REFERENCED_TYPE
------------------ ------------------
EVALUATION CONTXT  TABLE
EVALUATION CONTXT  TYPE
FUNCTION           FUNCTION
FUNCTION           LIBRARY
FUNCTION           PACKAGE
FUNCTION           PROCEDURE
FUNCTION           SYNONYM
FUNCTION           TABLE
FUNCTION           TYPE
FUNCTION           VIEW
INDEX              FUNCTION
INDEX              INDEXTYPE
INDEX              PACKAGE
INDEXTYPE          OPERATOR
INDEXTYPE          TYPE
JAVA CLASS         JAVA CLASS
JAVA DATA          JAVA CLASS
MATERIALIZED VIEW  TABLE
OPERATOR           FUNCTION
OPERATOR           OPERATOR
OPERATOR           PACKAGE
OPERATOR           TYPE
PACKAGE            FUNCTION
PACKAGE            LIBRARY
PACKAGE            OPERATOR
PACKAGE            PACKAGE
.....



使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
17#
发表于 2014-2-13 10:23 | 只看该作者
oracle_cj 发表于 2014-1-13 21:12
一般情况,这个系统视图都够用了

动态sql里面的表是找不出来的,所以很多情况下系统视图不够用啊

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2014-2-18 13:18 | 只看该作者
dba_dependencies 不就可以么, 何必多此一举? 而且很多时候, package或者function都是wrap的, 这个根本就用不上

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上有钱
日期:2014-10-17 12:56:56处女座
日期:2015-08-30 22:09:39
19#
发表于 2014-2-18 20:28 | 只看该作者
oracle_cj 发表于 2014-1-12 23:00
select *from dba_dependencies. t where t.refer..name ='包名'

使用道具 举报

回复
求职 : 研发工程师
论坛徽章:
3
优秀写手
日期:2014-02-13 06:00:122014年新春福章
日期:2014-02-18 16:48:49马上加薪
日期:2014-02-18 16:48:49
20#
 楼主| 发表于 2014-2-19 22:39 | 只看该作者
看大家讨论的这么激烈,我来说下我写这个存储过程当时的情况吧。
当时用python去解析datastage导出的xml文件,非高级解析,只是找出其中的所有Oracle Stage,然后解析出每个Oracle Stage中用引用到的表和列。
但是很多Oracle Stage中用到的都是User Defined Sql,然后又没那么大精力去做像数据库本身一样的SQL解析(真相是我不会^_^)。然后突然想到用正则表达式来暴力拆词,把每个拆出来的词去数据库user_tables中做一次校验。通过这种方式来找出用户自定义SQL中所有用到的表。所以当时就是用python解析出user defined sql之后在数据库中建立如下的临时存储过程:

  1. create or replace p_tmp_proc
  2. as
  3. begin
  4.   /*
  5.   USER DEFINED SQL
  6.   */
  7.   null;
  8. end;
复制代码
然后调用本贴所提到的存储过程来解析这个临时过程即可。

不过,以前是没用过系统的数据字典,在看了大家的回复之后,想到也可以把user defined sql建立成一个临时的视图,
  1. create or replace view p_tmp_view as
  2. USER DEFINED SQL;
复制代码
然后去系统数据字典中看视图的依赖对象,应该也不错!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

DTCC2018购票6.8折优惠进行时

中国数据库技术大会是国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会。 2018年5月10-12日,第九届中国数据库技术大会将如约而至。本届大会以“数领先机•智赢未来”为主题,设定2大主会场及20个技术专场,邀请来自国内外互联网、金融、教育等行业百余位技术专家,共同探讨Oracle、MySQL、NoSQL、大数据等领域的前瞻性热点话题与技术。
----------------------------------------
优惠时间:2018年2月13日前

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
北京赛车pk10 申博官网 北京赛车pk10 六台宝典现场开奖 北京赛车pk10历史记录 北京赛车开奖 北京赛车预测 949494开奖结果今晚 威尼斯人线上娱乐 手机投注平台 幸运28投注技巧 pk10助赢软件 北京pk10百度鼎盛彩票网 北京赛车聚彩 北京pk10如何稳杀3码 pk10稳赢方法 pk10定位计划 pk10包赢计划群