【发布时间】:2010-10-31 15:40:36
【问题描述】:
我需要使用什么 SQL 来列出 Oracle 数据库上的所有存储过程?
如果可能的话,我想要两个查询:
- 按名称列出所有存储过程
- 列出存储过程的代码,并给定一个名称
【问题讨论】:
标签: sql oracle stored-procedures
我需要使用什么 SQL 来列出 Oracle 数据库上的所有存储过程?
如果可能的话,我想要两个查询:
【问题讨论】:
标签: sql oracle stored-procedures
要列出您连接的数据库中的所有存储过程,只需执行以下命令:
select object_name from user_procedures;
【讨论】:
这里是一个更简单的 SQL SELECT * FROM User_Procedures;
【讨论】:
我认为从 DBA_OBJECTS 枚举可能漏掉了很多过程: (我在 Oracle 12c 上,以 SYS 身份登录)
select count(*) from dba_objects where object_type = 'PROCEDURE';
202
整个 ORACLE 数据库只能有 202 个过程,这看起来真的是不可能的。
从 DBA_PROCEDURES 查询:
select owner||'-'||object_name || '-'||procedure_name from
dba_procedures WHERE PROCEDURE_NAME IS NOT NULL;
26539 rows selected.
现在关注 SYS 模式,它是每个数据库的默认模式(不是我独有的):
查询属于 SYS 的匿名存储过程 (http://www.praetoriate.com/t_high_perform_calling_procedures.htm):
select owner||'-'||object_name || '-'||procedure_name from dba_procedures WHERE PROCEDURE_NAME IS NULL and owner = 'SYS';
994 rows selected.
而SYS的非匿名存储过程有15K:
select owner||'-'||object_name || '-'||procedure_name from dba_procedures WHERE PROCEDURE_NAME IS NOT NULL and owner = 'SYS';
15408 rows
【讨论】:
如果您想获得对自省存储过程(参数等)的所有调用,您可以将其从这个开源包中提取出来:
http://code.google.com/p/orapig
OraPIG 是 Oracle Python 接口生成器。它内省 oracle 包并为它们生成 python 包装器。
【讨论】:
DBA_OBJECTS 视图将列出过程(以及几乎所有其他对象):
SELECT owner, object_name
FROM dba_objects
WHERE object_type = 'PROCEDURE'
DBA_SOURCE 视图将列出相关过程的源代码行:
SELECT line, text
FROM dba_source
WHERE owner = ?
AND name = ?
AND type = 'PROCEDURE'
ORDER BY line
注意:根据您的权限,您可能无法查询DBA_OBJECTS 和DBA_SOURCE 视图。在这种情况下,您可以改用ALL_OBJECTS 和ALL_SOURCE。 DBA_ 视图包含数据库中的所有对象,而 ALL_ 视图仅包含您可以访问的那些对象。
【讨论】: