我连接到一个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上的DB2数据库。
谢谢!
发布于 2013-01-17 04:34:14
update library/file set field = field + 1;
select field from library/file;
[program code line finishes executing]
[increment value by one]这将处理另一个应用程序在您获取它的时间和更新它的时间之间更新数字的问题。更新它,然后使用它。如果两个应用程序试图同时更新,其中一个会等待。
SEQUENCE对象就是为这个目的而设计的,但是如果你不得不更新这个'next ID‘文件,我就会这么做。点击@Clockwork-Muse的评论中的链接,获取有关序列对象的信息,或者尝试this example from V5R4。
发布于 2013-01-17 07:20:11
如果此文件仅用于单行存储计数器,请考虑使用DB2 SEQUENCE来管理下一个可用数字。这就是序列设计的目的。
要设置它,请使用CREATE SEQUENCE语句。
要递增该值并进行检索,请使用NEXT VALUE FOR sequence-name形式的SEQUENCE reference表达式。要找出最近的值是什么,请使用PREVIOUS VALUE FOR sequence-name。这些表达式可以像正则any列表达式一样使用,例如在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-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);之前的值是特定作业的本地值,因此应该不会有另一个作业获得相同编号的风险。
发布于 2014-02-13 14:48:35
他的要求是这样的:
UPDATE sometable
SET somecounter = somecounter + 10,
:returnvar = somecounter + 10;同时更新和检索。
这在MSSQL中是可能的,事实上我在那里用得很多,
但是DB2似乎没有这个功能。
https://stackoverflow.com/questions/14362354
复制相似问题