获取PL/SQL中的本地过程列表

Bor*_*ski 2 oracle plsql

我在DECLARE..BEGIN..END;块中定义了几个本地函数/过程:

DECLARE
  PROCEDURE a IS
  BEGIN
    ...
  END;
  PROCEDURE b IS
  BEGIN
    ...
  END;
BEGIN

END;
Run Code Online (Sandbox Code Playgroud)

如何获得所有已定义函数/过程的列表?(在这个例子中:['a','b'])

Ste*_*ein 5

正如评论中所提到的,将程序和函数放入包中会更好,然后在匿名块中调用那些打包的子程序.

此步骤将使您可以更轻松地查找,修复和维护代码.

此外,作为存储的数据库对象,您可以利用数据字典视图和其他数据库功能来分析代码.例如,如果要知道包中的所有子程序的名称,或者甚至是单个过程或函数中的嵌套/本地子程序,则可以使用PL/Scope.

ALTER SESSION SET plscope_settings='identifiers:all'
/

CREATE OR REPLACE PACKAGE my_pkg
   AUTHID DEFINER
IS
   FUNCTION my_function1
      RETURN NUMBER;

   FUNCTION my_function2
      RETURN VARCHAR2;
END;
/

WITH one_obj_name AS (SELECT 'MY_PKG' object_name FROM DUAL)
    SELECT LPAD (' ', 2 * (LEVEL - 1)) || usage || ' ' || name usages
      FROM (SELECT ai.object_name,
                   ai.usage usage,
                   ai.usage_id,
                   ai.usage_context_id,
                   ai.TYPE || ' ' || ai.name name,
                   ai.line,
                   ai.col
              FROM all_identifiers ai, one_obj_name
             WHERE ai.object_name = one_obj_name.object_name)
START WITH usage_context_id = 0
CONNECT BY PRIOR usage_id = usage_context_id
/

USAGES
-----------------------------------------
DECLARATION PACKAGE MY_PKG  
  DECLARATION FUNCTION MY_FUNCTION1 
    REFERENCE NUMBER DATATYPE NUMBER    
  DECLARATION FUNCTION MY_FUNCTION2 
    REFERENCE CHARACTER DATATYPE VARCHAR2   
Run Code Online (Sandbox Code Playgroud)

PL/Scope是一个非常强大的实用程序,内置于PL/SQL中.查看这些资源以获取更多信息:

Philippe Salvisberg的PL/Scope Utilities

关于PL/Scope的博客文章