2013-05-17 24 views
2

我是PL/SQL的初学者,所以我不知道这个问题是否合理。我试图在Oracle 11g中的包(不是在模式下)下找到存储过程的object_id。我试着查询我认为应包含SP的object_Id的以下系统表/视图。存储过程中的object_id存储在Oracle中的哪个位置?

  1. ALL_PROCEDURES
  2. User_obects

的ALL_PROCEDURES观点确实包含我找SP的名称,但它仅包含包的对象ID。我想包下找到的存储过程的object_id的原因是是:

  1. 一些PL/SQL程序员我谈的来告诉我,包下的SPS /函数不被视为一个对象。我想明白为什么。

  2. 我想知道,在同一个软件包下有多少其他SP是否会被引用。我希望public_dependency视图包含这个映射,除非有人告诉我这是错误的观点。

  3. 如果SP /函数未被标识为包下的对象,那么如何获取引用特定SP的SP列表?

我已经在Stackoverflow中发布了另一个问题,这导致我到链接How do you programatically identify a stored procedure's dependencies?。但是在这篇文章中提到的脚本并没有帮助我,因为user_objects没有包中的存储过程的任何条目。它只在Schema下有SP。

回答

2

我谈过的一些PL/SQL程序员告诉我一个包下的SP /函数不被视为一个对象。我想明白为什么。

oracle数据库中的包是对逻辑上相关的对象(例如类型,变量,过程和函数)进行分组的模式单元。他们被认为是原子单位,如果在一个包中的一些程序是指到另一个程序在另一个包,我们有情况,当第一包本身指的是第二包。所以,这里的最小对象是包装本身,而不是程序包,类型或包中的其他东西。

我想知道,在同一个软件包下还有多少其他SP可以参考。我希望public_dependency视图包含这个映射,除非有人告诉我这是错误的观点。

我从来没有碰到过的信息如何得到它。如果引用在包内,那么这个包就是我认为的独立对象。

如果SP /函数未被标识为包下的对象,那么如何获取引用特定SP的SP列表?

您需要使用包含源代码视图,如user_source/all_source/dba_source

+0

是啊,我的想法是多少第一点相同.. – Sathya

+0

感谢ZZA。我一直发现,在Oracle中,简单的事情很难实现(或没有实现)。 – pradeeptp

0

我不会评论第一点,因为我不知道Oracle的设计文档&思考过程。我相信,由于软件包中定义的程序&包含在依赖于它们的软件包&中,因此不会为其分配对象ID。

我想了解,如何在同一包下许多其他的SP这是否SP GET简称

最简单的方法是查询user_source/all_source/dba_source取决于您的访问权限。由于这些视图包含所有源代码,因此您必须提供适当的过滤器。

如果SP /函数未被标识为包下的对象,那么如何获取引用特定SP的SP列表?

参见上文。

+0

我知道我可以查询USER_SOURCE,但这并没有给我的存储过程的任何特定ID。而且,它不是建立参考树的非常有效的方法。 – pradeeptp

+0

@pradeeptp你提到你要查找的SP被多少其他的SP简称。查询user_source会为您提供。如果你11g及以上,你可以尝试使用PL/Scope。看看甲骨文的PL /范围(http://stackoverflow.com/q/2781292)[你怎么能告诉我们,如果一个PL/SQL程序包,正在使用的程序或功能?](HTTP://计算器。 com/q/4670164) – Sathya

+0

感谢您的输入。我知道我可以查询user_source表,但是我发现查询源代码的引用非常低效。那么,你能否确认没有将存储过程的object_id存储在包中的表? – pradeeptp