我们的环境当前是 AIX 上的 DB2 9.7 Fix Pack 4。
我正在设计和编码一些 SQL PL 存储过程,负责将数据归档到归档模式中,然后从主模式中清除旧的/不需要的数据。
我创建了一些用户定义类型 (UDT),特别是行类型和游标类型。我正在考虑将我的逻辑分成三个存储过程。Proc A
将用于清除与我的主 EVENT 表相关的特定数据集(即,EVENT
以及它下面的所有内容)。我真的不希望其他人能够调用它。我只想模块化逻辑。Proc B
将从EVENT
最终用户想要的(和其他表)中归档数据,然后调用Proc A
以清理原始数据。Proc C
将用于寻找EVENTs
可以丢弃的东西,然后调用Proc A
实际工作。
现在我可以创建彼此独立的所有这些,然后以这种方式部署它们。或者....我可以使用一个模块。据我了解,模块允许我将相关功能(类型、存储过程、函数等)关联在一起。它还允许我决定我希望哪些对象可以在模块外部访问,即可以直接调用/使用,哪些只能在模块内部调用(例如上面的情况,我可以隐藏存储的Proc A
,但允许B
并C
调用它)。
这听起来非常有趣。但它也有缺点。我猜它不是任何 SQL 标准的一部分,而是特定于 IBM DB2 的东西。即使这样,您也不能通过 Data Studio 或 Control Center 直接与模块交互(除了CALL
外部程序/函数)。而且您也不能直接在 IBM 的 InfoSphere Data Architect 中创建它们。所以我必须独立维护 DDL。
所以模块概念听起来很方便。我可以隐藏一些东西并选择可以调用的东西以确保有人不会滥用任何东西。
但是,鉴于命令行之外的 IBM 工具似乎不支持它……我想知道……谁都使用模块(特别是在 DB2 LUW 中)?有没有人?这有意义吗?如果没有,是否有另一种方法可以实现模块化代码的想法,同时使“模块”无法直接调用?
我无法回答您所有的问题,但值得一提的是:
我在我开发的两个项目中使用模块。使用模块,我可以更轻松地组织代码,并对用户隐藏例程。此外,模块为我提供了一种为模块提供标准名称的方法,并且模式提供了版本(https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/appupgrade?lang=en_us)
模块的另一个优点是可以灵活地创建递归函数。