我在比较三个 Oracle 数据库模式。
我想获得每个数据库中使用的所有函数和存储过程的列表。是否可以通过一个查询实现此目标?(最好包括一个指示它们是否编译的标志)
理想情况下,希望有一条单一的查询语句,其中包含一个标志,说明每个模式中是否包含该函数/存储过程。但即使只有第一部分,也比手动检查每个模式要好。
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE')
列 STATUS 告诉您对象是有效的还是无效的。如果无效,则必须尝试重新编译,ORACLE 在此之前无法告诉您是否有效。
对于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文章
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
'TABLE'
- Bitterbluedrop function xxx
,drop procedure xyz
,drop package foobar
- Erich KitzmuellerSELECT
语句仅选择OBJECT_NAME
而不是*
。无论如何,这个编辑已经被拒绝了(不是由我审核的审阅者);在我看来,至少应该选择OBJECT_NAME,OBJECT_TYPE,STATUS
以获得有用的输出。话虽如此,在这种情况下使用SELECT *
也没有问题。 - Erich Kitzmueller