我如何在包中读取函数和过程 body/ddl?

Posted

技术标签:

【中文标题】我如何在包中读取函数和过程 body/ddl?【英文标题】:How can I read functions and procedures body/ddl while they are in a package? 【发布时间】:2011-11-09 21:33:01 【问题描述】:

任务:

将包中的所有函数和过程移动到当前的 Oracle 模式。 (你可以想象一个你可能需要它的情况,如果不需要的话 - 把它当作一个挑战!)

问题:

当它们在包中时,我如何阅读函数/程序“正文”?我知道我可以使用all_sourcedba_source 和其他人来获取包体行,但这意味着我必须解析所有这些行/字符串——这应该是一种更简单的方法。不是吗?

【问题讨论】:

据我所知,您必须解析 ALL_SOURCE... @Radu:“解析”是什么意思?您是否尝试提取函数和过程并在包之外创建它们? @jonearles 是的!这是任务的主要部分。 【参考方案1】:

如果您可以访问 Toad,它会很好地做到这一点。

另外,查看DBMS_METADATA package,特别是GET_DDL 过程。

希望对您有所帮助。

【讨论】:

DBMS_METADATA 使用 GET_DLL 方法获取整个包体。我会看看另一个建议。谢谢!【参考方案2】:

你究竟为什么需要这个?

您是否只是想像在您的架构中定义的那样执行函数和过程?如果是这样,那么invoker's rights 可能会有所帮助。

您这样做是为了测试吗?如果是这样,看看这个答案:Is there a way to access private plsql procedures for testing purposes?(总结:使用条件编译来选择性地公开函数和过程)

如果您确实需要将包分解为函数和过程,如果您想要 100% 准确,则需要手动执行。

仅阅读源代码并尝试自动执行会存在许多潜在问题。包变量、类型、初始化、安全性(每个函数都可以是公共的吗?)、过程中的过程、重复名称、包装的源代码等呢?

【讨论】:

嗨,乔尼尔斯!在寻找我的问题的答案时,我发现了这个 - bypsoft.blogspot.com/2008/05/list-all-functions-and-stored.html - 女巫似乎完全符合我的需要,但它并没有真正起作用。这个任务的想法是使所有这些过程和函数可移植,所以当你想重新组织你的业务逻辑并且你没有其他方法来重新编译那种过程/函数(基本上是移动它们) - 你可能想要这样做而不是手动处理它们。 我认为不会有任何通用的方法来解决这个问题。如果你从预期的上下文中删除一个函数,你就不能指望它正常工作。听起来您正试图使您的环境过于动态。说“这里是软件包,如果你不喜欢其中的所有功能,就不要使用它们”有什么问题?但如果您仍然需要这样做,将函数名称始终放在end 之后可能会有所帮助,以便于解析。

以上是关于我如何在包中读取函数和过程 body/ddl?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Sql 查询:如何在包中旋转函数 Sum()?

R:我如何在包中添加额外的功能?

如何在不导入所有函数的情况下在包中使用 data.table?

如何使用静态库传输资源文件(如何将资源包装在包中)?

如何在包中只导入没有 exec __init__.py 的子模块

oracle 包中定义全局变量