2014-03-07 55 views
1

我想知道是否有人知道在DB2/400的存储过程中是否可以使用外部描述的变量?是否可以在DB2400中根据外部列声明变量

我们有很多存储过程,它们都访问某个文件。我们最近经历了一次字段扩展,V7正在抛出一个SQLSTATE 1004(可变大小差异)。我现在需要外出并更改引用此文件的所有过程,并将扩展的字段大小用于内部变量。

理想情况下,我想更改程序以允许此定义的外部参照,因此在将来,我所要做的就是重新编译此过程。这在DB2中可能吗?

一些更清楚:

功能getItemCost(店内,inItem)

声明storeVendor数字(7,0); 从vendor_table中选择vendor到storeVendor,其中store_number = inStore);

{其他逻辑}

如果我们从7卖主长度扩展到10,I将需要改变该代码。

回答

3

否SQL CREATE PROCEDURE语句不允许“like(somecolumn)”。但这是一件好事,因为该接口是存储过程与其所有调用者之间的契约。如果该接口可以动态改变,调用者将如何知道如何为变量分配内存?最终,如果基础列大小发生变化,则需要使用该列和该存储过程的所有调用者查找存储过程,并将它们全部更改。想象一下,其中一位调用者将列放在5250显示器上,或将其打印在报告上 - 您需要为新扩大的列腾出空间。

减轻负担的一种方法是创建一个新的存储过程(GetCustomerAmountDue_v2),它使用新的更长的列定义。然后任何需要更长定义的调用者都可以改变来调用_v2过程。

如果你的列是一个字符列,那么你可能返回一个VARCHAR而不是CHAR;该界面不需要改变,因为合同已经允许返回不同数量的字符。

+0

谢谢@Buck。我理解呼叫签名,我更多地指的是内部变量,而不是参数。例如: function getItemCost(inStore,inItem) declare storeVendor numeric(7,0); 从vendor_table中选择供应商到storeVendor,其中store_number = inStore); {其他逻辑} 如果我们将供应商的长度从7扩展到10,我需要更改此代码。 – jgriffin

1

假设IBM i 6.1或更高版本,您应该能够使用CREATE TYPE将变量定义定义为用户定义类型(UDT)。如果您使用UDT定义表列,那么如果删除并重新创建UDT,则需要删除并重新创建这些表。但不知何故,在重新创建UDT后,SQL过程似乎很好。

你可能会做这样的事情:

CREATE TYPE sqlexample/decN_M 
AS decimal(7,2) 

你会宣告您的存储过程变量decN_M而不是十进制(7,2)。在以后的日子,你可能会遇到:

DROP TYPE sqlexample/decN_M ; 
CREATE TYPE sqlexample/decN_M 
AS decimal(10,2) 

当你以后运行proc,则应该处理的值作为DECIMAL(10,2)。如果这可以为​​你工作,一些测试应该让你快速知道。

相关问题