【发布时间】:2010-12-21 14:59:48
【问题描述】:
我正在比较三个 Oracle 模式。
我想获取每个数据库中使用的所有函数和过程的列表。这可以通过查询吗? (最好包括一个关于它们是否编译的标志)
理想情况下,最好有一个带有标志的查询,该标志表明函数/过程是否在每个模式中。但即使只是开始也比手动检查每个模式要好。
【问题讨论】:
我正在比较三个 Oracle 模式。
我想获取每个数据库中使用的所有函数和过程的列表。这可以通过查询吗? (最好包括一个关于它们是否编译的标志)
理想情况下,最好有一个带有标志的查询,该标志表明函数/过程是否在每个模式中。但即使只是开始也比手动检查每个模式要好。
【问题讨论】:
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE')
STATUS 列告诉您对象是 VALID 还是 INVALID。如果无效,你必须尝试重新编译,ORACLE无法告诉你它是否可以工作。
【讨论】:
'TABLE' 有人可以提示如何删除函数/过程/包吗?
drop function xxx, drop procedure xyz, drop package foobar
SELECT 语句将只选择OBJECT_NAME 而不是*。无论如何,此编辑已被拒绝(被我以外的审阅者拒绝); IMO,至少,应该选择OBJECT_NAME, OBJECT_TYPE, STATUS 以获得有用的输出。也就是说,SELECT * 在这种情况下不会受到伤害。
对 dba_arguments、dba_errors、dba_procedures、dba_objects、dba_source、dba_object_size 进行描述。 其中每一个都有部分图片用于查看过程和功能。
另外,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 的顺序。
如果您还需要查看触发器并比较架构之间的其他内容,您应该查看Article on Ask Tom about comparing schemas
【讨论】:
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
【讨论】: