如果此文件只是打算让单行存储您的计数器,请考虑使用 DB2 SEQUENCE来管理下一个可用数字。这就是 SEQUENCE 的设计目的。
要设置它,请使用CREATE SEQUENCE语句。
要增加值并检索,请使用SEQUENCE形式的引用表达式NEXT VALUE FOR sequence-name
。要找出最近的值是什么,请使用PREVIOUS VALUE FOR sequence-name
. 这些表达式可以像常规的任何列表达式一样使用,例如在 SELECT 或 INSERT 语句中。
假设,例如,您想对发票编号执行此操作(也许您的会计部门不希望他们的第一个发票编号为 000001,因此我们将其初始化得更高)。
CREATE SEQUENCE InvoiceSeq
as decimal (7,0)
start with 27000; -- for example
您可以像这样获得新发票的编号:
SELECT NEXT VALUE FOR InvoiceSeq
INTO :myvar
FROM SYSIBM/SYSDUMMY1;
但是这个 SYSIBM/SYSDUMMY1 表是什么?我们并没有真正从餐桌上得到任何东西,那么我们为什么要假装这样做呢?SELECT 需要一个 FROM 表子句。但由于我们不需要,让我们使用VALUES INTO语句。
VALUES NEXT VALUE FOR InvoiceSeq
INTO :myvar;
这样就增加了计数器,并将值放入我们的变量中。您可以使用该值插入到我们的 InvoiceHeaders 和 InvoiceDetails 表中。
或者,您可以在编写 InvoiceHeader 时增加计数器,然后在编写 InvoiceDetails 时再次使用它。
INSERT INTO InvoiceHeaders
(InvoiceNbr, Customer, InvoiceDate)
VALUES (NEXT VALUE FOR InvoiceSeq, :custnbr, :invdate);
for each invoice detail
INSERT INTO InvoiceDetails
(InvoiceNbr, InvoiceLine, Reason, Fee)
VALUES (PREVIOUS VALUE FOR InvoiceSeq, :line, :itemtxt, :amt);
PREVIOUS VALUE 是特定工作的本地值,因此不应该有另一个工作获得相同数字的风险。