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

Posted

技术标签:

【中文标题】特定存储过程或函数的源代码【英文标题】:Source code for specific stored procedure or function 【发布时间】:2010-07-09 10:18:55 【问题描述】:

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

类似这样的:

所有者 |包名 |对象名称 |超载 |论据 |来源

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

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

提前干杯

【问题讨论】:

提取函数定义的目的是什么? 我的意思是以类似 DDL 的方式定义 - 更改为源代码以尝试更清楚地表明我正在尝试列出特定过程或函数的代码 “列出代码”,如将函数本身打印到打印机或隔离在文件中? +1,偶尔这会很方便。 【参考方案1】:

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

另一种可靠访问 PLSQL 包元素的方法是使用语言解析器。 DMS Software Reengineering Toolkit 有一个完整的 PLSQL 解析器。

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

【讨论】:

以上是关于特定存储过程或函数的源代码的主要内容,如果未能解决你的问题,请参考以下文章

Mysql存储过程和函数区别介绍

mysql 存储过程

存储过程和函数之间有几个区别

MySQL存储过程

MySQL存储过程

Mysql存储过程