如何获取PL/SQL中DECLARE块内定义的本地过程/函数列表
获取PL/SQL匿名块中本地定义的过程/函数列表
在PL/SQL的匿名块里定义的本地过程/函数属于会话级临时对象,它们不会被持久化到数据库的数据字典中,所以没法直接用常规的USER_PROCEDURES这类视图查询。不过我们可以借助Oracle的PL/Scope工具来捕获这些本地子程序的信息,具体步骤如下:
步骤1:启用PL/Scope收集标识符
首先在当前会话中开启PL/Scope,让编译器收集代码中的所有标识符信息:
ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:ALL';
步骤2:执行你的匿名块
比如执行你提供的示例块:
DECLARE PROCEDURE a IS BEGIN NULL; END; PROCEDURE b IS BEGIN NULL; END; BEGIN NULL; END; /
步骤3:查询本地子程序列表
执行完块后,通过USER_IDENTIFIERS视图筛选出我们需要的本地过程:
SELECT name FROM user_identifiers WHERE object_type = 'PROCEDURE' AND usage = 'DEFINITION' AND object_name = ( SELECT name FROM user_identifiers WHERE usage_context_id = 0 AND object_type = 'ANONYMOUS BLOCK' ) ORDER BY name;
这个查询会返回预期的结果:
NAME ---- a b
注意事项
- PL/Scope是Oracle 11g及以上版本才支持的功能,如果你用的是更早的版本,这个方法不适用
- 必须先设置
PLSCOPE_SETTINGS,否则编译器不会收集标识符信息,查询会返回空结果 - 如果在同一个会话中执行多个匿名块,建议在执行目标块后立即查询,或者通过
LINE、COLUMN等字段进一步筛选,避免混淆不同匿名块的结果
内容的提问来源于stack exchange,提问作者Boris Brodski




