You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取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,否则编译器不会收集标识符信息,查询会返回空结果
  • 如果在同一个会话中执行多个匿名块,建议在执行目标块后立即查询,或者通过LINECOLUMN等字段进一步筛选,避免混淆不同匿名块的结果

内容的提问来源于stack exchange,提问作者Boris Brodski

火山引擎 最新活动