【问题标题】:Get list of local procedures in PL/SQL获取 PL/SQL 中的本地过程列表
【发布时间】:2018-09-23 17:55:19
【问题描述】:

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

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

END;

如何获取所有已定义函数/程序的列表? (在本例中:['a', 'b'])

【问题讨论】:

  • @Sinto 不幸的是,这不适用于 local 函数和过程。我错过了什么吗?
  • 我不知道这是否可能......但是,如果你告诉我你为什么想要它,我们可能会提供另一种选择。
  • 如果你有一个实际的包裹,你会得到更多
  • 我们基于 java 的解析器可以在 SQLDev 中获取这些,但我们还没有开源...YET

标签: oracle plsql


【解决方案1】:

正如 cmets 中提到的,将过程和函数放入一个包中,然后在匿名块中调用这些打包的子程序会好得多。

随着时间的推移,这一步将使查找、修复和维护您的代码变得更加容易。

另外,作为存储的数据库对象,您可以利用数据字典视图和其他数据库功能来分析您的代码。例如,如果您想知道一个包中所有子程序的名称,甚至是单个过程或函数中的嵌套/局部子程序的名称,您可以使用 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   

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

Philippe Salvisberg's PL/Scope Utilities

My blog posts on PL/Scope

【讨论】:

    【解决方案2】:

    如果匿名 PL/SQL 块是存储对象的一部分并且您使用的 Oracle 数据库版本 >= 11.1,则可以使用 PL/Scope。

    ALTER SESSION SET plscope_settings='IDENTIFIERS:ALL';
    
    CREATE OR REPLACE PROCEDURE p IS
    BEGIN
       DECLARE
          PROCEDURE a IS
          BEGIN
            NULL;
          END;
          PROCEDURE b IS
          BEGIN
            NULL;
          END;
       BEGIN
          NULL;
       END;
    END p;
    /
    
    SELECT name 
      FROM user_identifiers
     WHERE object_name = 'P'
       AND usage = 'DEFINITION'
       AND type IN ('PROCEDURE','FUNCTION')
       AND line > 1;
    
    NAME                          
    ------------------------------
    A                             
    B
    

    如果匿名 PL/SQL 块存储在其他地方,您需要某种提取逻辑和 PL/SQL 解析器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2013-10-01
      相关资源
      最近更新 更多