我正在连接到 DB2 数据库并执行 SQL 语句。
正在做的一个例子是:
select field from library/file
[program code line finishes executing]
[increment value by one]
update library/file set field = 'incremented value'
我需要在返回值的同时立即更新该值。而不必等待脚本完成,然后运行单独的 UPDATE 语句。
我想做的事情的概念是这样的:
select field from library/file; update library/file set field = (Current Value + 1); go;
请注意...这不是大多数人熟悉的常见 SQL 数据库,它是 IBM i 上的 DB2 数据库。
谢谢!
最佳答案
考虑使用 DB2 SEQUENCE管理下一个可用的数字,如果此文件只是打算用单行存储计数器。这就是 SEQUENCE 的设计目的。
要进行设置,请使用 CREATE SEQUENCE声明。
要增加值并检索,请使用 SEQUENCE reference NEXT 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 表是什么?我们并没有真正从 table 上得到任何东西,那么为什么我们要假装这样做呢? SELECT 需要 FROM-table 子句。但由于我们不需要,所以我们使用 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);
先前的值是特定作业的本地值,因此不存在其他作业获得相同编号的风险。
关于SQL/DB2 - 同时检索值和更新/增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14362354/