包括编写在不同文件中的过程以打包在 PL/SQL 中

Posted

技术标签:

【中文标题】包括编写在不同文件中的过程以打包在 PL/SQL 中【英文标题】:Including procedure written in different file to package in PL/SQL 【发布时间】:2014-04-10 16:47:37 【问题描述】:

如果有办法包含程序,我已经搜索了很多以找到答案,这些程序写在不同的文件中进行打包。

文件夹可能如下所示:

包
  |
  包1
     |
     程序
         |
         proc1.sql
         proc2.sql
     包1.sql
...

在 package1.sql 中我希望有包头和包体,但是某些过程应该存储在文件 proc1.sql 等中。

有什么办法吗? 它可以真正帮助大体包或有很多程序的包。

提前感谢:)

【问题讨论】:

您希望您的文件是纯 SQL 脚本吗?或者您可以让它们成为依赖 SQLPlus 的 SQLPlus 脚本来执行预处理步骤以在将组件作为一个块发送到数据库之前重新组装组件?可以使用 SQL*Plus 预处理器路线,但这将是非常独特的(因此可能需要额外的努力来支持)。我通常建议,如果一个包有这么多程序,你不希望它们都在一个文件中,那么包本身做的太多了,应该重构。 1.它必须是纯 SQL scipts。 2.如果我可以重构包,那就太好了:) 问题是让它更容易,而不是更难。我只能说高级诊断系统使用了包程序,所以必须这样做......谢谢你的回答。看起来没有任何简单的解决方案。 你能不能写一个shell脚本来遍历目录结构并从子目录中找到的过程构建包?只是一个想法。 如果这是一个要求,我会走 SQL*Plus 路线。您可以使用 @ 语法在任意点包含其他脚本(只需确保 @ 位于行首)。 【参考方案1】:

这是不可能的。 CREATE OR REPLACE PACKAGECREATE OR REPLACE PACKAGE BODY 语句必须是完整的——它必须包含整个包规范或整个包体。这意味着整个规范必须在单个文件中的单个语句中,并且整个主体必须​​在单个文件中的单个语句中。当然,您可以将标头和规范分开到不同的文件中,但是您不能将它们分成多个部分,除非您使用一些预处理工具在将块发送到数据库之前重新组装它们。

当一个包足够大以至于单个文件变得难以处理并且有多个子组件可以逻辑地组合成一个更小的单元时,我强烈怀疑正确的答案是重构打包成多个更小、更集中的包。这非常像一个面向对象的程序员,发现他们的一个类随着时间的推移已经成长为一个god object/ Winnebago 对象,该对象做得太多,并且真正涵盖了应该由两个或三个对象负责的基础。最好硬着头皮开始重构,而不是试图通过分解源代码来解决问题。

【讨论】:

以上是关于包括编写在不同文件中的过程以打包在 PL/SQL 中的主要内容,如果未能解决你的问题,请参考以下文章

pl/SQL 过程从不同表中的值生成一个表中的值

如何以不同的方式处理 PL/SQL 中的不同异常?

如何编写 PL 以返回通过服务总线中的 DB 适配器自动生成强类型 XSD 的多行? (甲骨文 PL/SQL)

pl/sql编程基础

pl/sql 中的 ROWTYPE 定义

从 PL/SQL 中的过程返回值数组