我可以使用all_arguments和all_procedures列出任何给定包中的过程和函数,并使用DBMS_METADATA我可以提取该包的DDL。是否有一种简单的方法(除了大量的instring和substring调用之外)为包中的每个单独的代码块分别获取过程或函数源代码。
这样的事情:
所有者|包名|对象名称|超载|参数|源
显然,使用substring和instring会出现重载函数的问题。
All_arguments有subprogram_id字段,根据它上面非常稀疏的文档看起来它确实唯一地引用了它与包中相关的程序,但似乎没有任何东西使用它。
提前干杯
答案 0 :(得分:3)
IIRC,PLSQL允许嵌套包和函数。在这种情况下,您会发现“instring”和“substring”可能不足以提取源代码,因为您正面临递归,而字符串函数通常只处理较小的计算类(通常是正则表达式)。这是人们试图通过简单的字符串操作来解析语言的经典问题。你可以通过基本上黑客来制造一个穷人的解析器来解决字符串函数的限制,但是如果你想要它是致命的正确的话,这可能是一个惊人的工作量,因为你必须至少处理对你来说重要的递归语法规则提取
获得对PLSQL包元素的可靠访问的另一种方法是使用语言解析器。 DMS Software Reengineering Toolkit有一个完整的PLSQL解析器。
首先必须将包文本解压缩到文件中,然后将PLSQL解析器应用于它;在解析器内部生成抽象语法树(AST)。给定函数的名称,在AST中搜索具有匹配名称的函数是相当容易的。如果你的功能超载,你最终会得到多个命中;您可以通过嵌入它的层次结构或有关您可能具有的参数的信息来限定函数。在AST中确定了一个特定的功能后,可以要求DMS对该树进行漂亮打印,并重新生成该功能的文本(包括注释)。