存储在Oracle中的存储过程的object_id在哪里?

时间:2013-05-17 04:13:25

标签: oracle plsql

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

  1. All_procedures
  2. User_obects
  3. All_procedures视图确实包含我要查找的SP的名称,但它只包含包的对象ID。我想在Package下找到存储过程的object_id的原因是:

    1. 我交谈过的一些PL / SQL程序员告诉我,程序包下的SP /函数不被视为对象。我想了解原因。

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

    3. 如果SP /功能未被识别为包下的对象,那么如何获取引用特定SP的SP列表。

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

2 个答案:

答案 0 :(得分:3)

  

我交谈过的一些PL / SQL程序员告诉我,程序包下的SP /函数不被视为对象。我想了解原因。

oracle数据库中的包是模式单元,它对逻辑上相关的对象(例如类型,变量,过程和函数)进行分组。它们被视为原子单元,如果包中的某些过程引用另一个包中的另一个过程,我们就会遇到第一个包本身引用第二个包的情况。因此,这里的最小对象是包本身,而不是包中的过程或类型或其他东西。

  

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

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

  

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

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

答案 1 :(得分:0)

我不会对第一点发表评论,因为我不了解Oracle的设计文档&思考过程。我相信自从程序&包中定义的函数包含在包装中。依赖于它们,它们不会被赋予对象ID。

  

我想知道,在这个SP被引用的同一个包下有多少个其他SP

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

  

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

见上文。