Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 特定存储过程或函数的源代码_Oracle_Oracle10g - Fatal编程技术网

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

Oracle 特定存储过程或函数的源代码,oracle,oracle10g,Oracle,Oracle10g,我可以使用所有_参数和所有_过程来列出任何给定包中的过程和函数,并使用DBMS_元数据来提取该包的DDL。是否有一种简单的方法(除了大量的instring和substring调用)来分别获取包中每个单独代码块的过程或函数源代码 大概是这样的: 所有者|包名|对象名|重载|参数|源 显然,使用substring和instring会出现重载函数的问题 所有_参数都有subprogram_id字段,根据其上非常稀疏的文档,它看起来确实唯一地引用了它在包中与哪个过程相关,但似乎没有使用它的任何内容 提前

我可以使用所有_参数和所有_过程来列出任何给定包中的过程和函数,并使用DBMS_元数据来提取该包的DDL。是否有一种简单的方法(除了大量的instring和substring调用)来分别获取包中每个单独代码块的过程或函数源代码

大概是这样的:

所有者|包名|对象名|重载|参数|源

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

所有_参数都有subprogram_id字段,根据其上非常稀疏的文档,它看起来确实唯一地引用了它在包中与哪个过程相关,但似乎没有使用它的任何内容


提前欢呼

IIRC,PLSQL允许嵌套的包和函数。在本例中,您会发现“instring”和“substring”可能不足以提取源代码,因为您面临递归,而字符串函数通常只处理较小的计算类(通常是正则表达式)。这是人们试图用简单的字符串操作解析语言时遇到的一个典型问题。您可以通过黑客攻击生成一个穷人的解析器来绕过字符串函数的限制,但如果您希望它是绝对正确的,那么这可能是一个惊人的工作量,因为您必须至少处理对提取至关重要的递归语法规则

获得对PLSQL包元素的可靠访问的另一种方法是使用语言解析器。具有完整的PLSQL解析器


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

提取函数定义的目的是什么?我指的是以类似DDL的方式定义-更改为源代码以尝试更清楚地显示我试图列出特定过程或函数的代码“列出代码”,就像将函数本身打印到打印机或隔离在文件中一样?+1,每隔一段时间,这将是一件方便的事情。