是否可以基于外部列在DB2400中声明变量

时间:2014-03-07 15:22:53

标签: stored-procedures ibm-midrange db2-400

我想知道是否有人知道是否有可能在DB2 / 400的存储过程中有一个外部描述的变量?

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

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

更清晰:

function getItemCost(inStore,inItem)

声明storeVendor numeric(7,0); 从vendor_table中选择vendor into storeVendor,其中store_number = inStore);

{其他逻辑}

如果我们将供应商长度从7扩展到10,我需要更改此代码。

2 个答案:

答案 0 :(得分:3)

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

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

如果您的列是字符列,那么您可以返回VARCHAR而不是CHAR;接口不需要更改,因为合同已经允许返回不同数量的字符。

答案 1 :(得分:1)

假设IBM i 6.1或更高版本,您应该能够使用CREATE TYPE将变量定义定义为用户定义类型(UDT)。如果使用UDT定义表列,则在删除并重新创建UDT时,需要删除并重新创建表。但是在重新创建UDT之后,某些SQL程序似乎相处得很好。

您可能会这样做:

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

您将存储的proc变量声明为decN_M而不是DECIMAL(7,2)。稍后,您可以运行:

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

在此之后运行proc时,它应该将值处理为DECIMAL(10,2)。如果这对您有用,一些测试应该让您快速了解。