SQL / DB2 - 同时检索值和更新/增量

时间:2013-01-16 15:50:42

标签: sql select db2 sql-update ibm-midrange

我正在连接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数据库。

谢谢!

3 个答案:

答案 0 :(得分:4)

如果此文件只是用于存储计数器的单行,请考虑使用DB2 SEQUENCE来管理下一个可用的数字。这就是SEQUENCE的设计目标。

要进行设置,请使用CREATE SEQUENCE语句。

要增加值并检索,请使用NEXT VALUE FOR sequence-name形式的SEQUENCE reference表达式。要了解最新值,请使用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-table子句。但由于我们不需要,我们使用VALUES INTO语句。

VALUES NEXT VALUE FOR InvoiceSeq
    INTO :myvar;

这样就增加了计数器,并将值放入变量中。您可以使用该值INSERT到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是特定工作的本地值,因此不应该有其他工作获得相同数字的风险。

答案 1 :(得分:1)

update library/file set field = field + 1;
select field from library/file; 
[program code line finishes executing]
[increment value by one]

这可以解决另一个应用程序在您获取数据和更新数据之间更新数字的问题。更新它然后使用它。如果两个应用程序同时尝试更新,则会等待。

SEQUENCE对象的设计正是为了这个目的,但是如果你被迫保持这个“下一个ID”文件的更新,我就是这样做的。请点击@ Clockwork-Muse评论中的链接获取有关SEQUENCE对象的信息,或者尝试this example from V5R4

答案 2 :(得分:0)

他的要求是这样的:

UPDATE sometable
SET somecounter = somecounter + 10,
    :returnvar  = somecounter + 10;

同时更新和检索。

这在MSSQL中是可行的,实际上我在那里使用它,

但DB2似乎没有这个功能。