获取Oracle数据库中所有函数和过程的列表

67

我在比较三个 Oracle 数据库模式。

我想获得每个数据库中使用的所有函数和存储过程的列表。是否可以通过一个查询实现此目标?(最好包括一个指示它们是否编译的标志)

理想情况下,希望有一条单一的查询语句,其中包含一个标志,说明每个模式中是否包含该函数/存储过程。但即使只有第一部分,也比手动检查每个模式要好。

3个回答

137
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE')

列 STATUS 告诉您对象是有效的还是无效的。如果无效,则必须尝试重新编译,ORACLE 在此之前无法告诉您是否有效。


有人能给一个提示如何删除函数/存储过程/包吗?'TABLE' - Bitterblue
2
drop function xxx, drop procedure xyz, drop package foobar - Erich Kitzmueller
有人建议对我的答案进行编辑,使SELECT语句仅选择OBJECT_NAME而不是*。无论如何,这个编辑已经被拒绝了(不是由我审核的审阅者);在我看来,至少应该选择OBJECT_NAME,OBJECT_TYPE,STATUS以获得有用的输出。话虽如此,在这种情况下使用SELECT *也没有问题。 - Erich Kitzmueller
3
如果你有多个用户,只想列出该用户的对象,请添加另一个子句“AND OWNER =[THAT USER NAME]”。例如针对“user1”: SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') AND OWNER = 'user1' - LifeiSHot
如果您想比较包中的函数和过程,那么这个答案是不够的。 - cartbeforehorse

9

对于dba_arguments、dba_errors、dba_procedures、dba_objects、dba_source和dba_object_size执行describe操作。每个表都包含了查看过程和函数的部分信息。

此外,dba_objects中的object_type用于包的定义是'PACKAGE',用于包体是'PACKAGE BODY'。

如果你要在同一数据库上比较模式,请尝试:

select * from dba_objects 
   where schema_name = 'ASCHEMA' 
     and object_type in ( 'PROCEDURE', 'PACKAGE', 'FUNCTION', 'PACKAGE BODY' )
minus
select * from dba_objects 
where schema_name = 'BSCHEMA' 
  and object_type in ( 'PROCEDURE', 'PACKAGE', 'FUNCTION', 'PACKAGE BODY' )

并且交换ASCHEMA和BSCHEMA的顺序。

如果您还需要查看触发器并比较模式之间的其他内容,您应该查看有关比较模式的Ask Tom文章


4
 SELECT * FROM all_procedures WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') 
 and owner = 'Schema_name' order by object_name

这里的'Schema_name'是模式的名称,例如我有一个名为PMIS的模式,那么示例将会是:

SELECT * FROM all_procedures WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') 
and owner = 'PMIS' order by object_name

在此输入图片描述

参考:https://www.plsql.co/list-all-procedures-from-a-schema-of-oracle-database.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接