特定存储过程或函数的源代码

Chr*_*ris 5 oracle oracle10g

我可以使用all_arguments和all_procedures列出任何给定包中的过程和函数,并使用DBMS_METADATA我可以提取该包的DDL.是否有一种简单的方法(除了大量的instring和substring调用之外)为包中的每个单独的代码块分别获取过程或函数源代码.

像这样的东西:

所有者| 包名| 对象名称| 超载| 参数| 资源

显然使用substring和instring会出现重载函数的问题.

All_arguments有subprogram_id字段,根据它上面非常稀疏的文档看起来它确实唯一地引用了它与包中相关的程序,但似乎没有任何使用它的东西.

提前干杯

Ira*_*ter 3

IIRC、PLSQL 允许嵌套包和函数。在这种情况下,您会发现“instring”和“substring”可能不足以提取源代码,因为您面临递归,并且字符串函数通常只处理较小类的计算(通常是正则表达式)。这是人们试图通过简单的字符串操作来解析语言时遇到的一个经典问题。您可以通过本质上破解字符串函数的限制来生成一个穷人的解析器,但如果您希望它是绝对正确的,这可能是一个令人惊讶的工作量,因为您必须至少处理对您来说重要的递归语法规则。萃取。

可靠地访问 PLSQL 包元素的另一种方法是使用语言解析器。DMS软件重组工具包具有完整的 PLSQL 解析器。

您必须首先将包文本提取到文件中,然后对其应用 PLSQL 解析器;在解析器内部生成抽象语法树(AST)。给定函数的名称,在 AST 中搜索具有匹配名称的函数就相当容易了。如果你有重载的函数,你最终会得到不止一次的命中;您可以通过嵌入函数的层次结构或有关您可能拥有的参数的信息来限定该函数。在确定了 AST 中的特定函数后,可以要求 DMS 漂亮地打印该树,并且它将重新生成该函数的文本(包含注释)。