首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL / DB2 -同时检索值和更新/增量

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

Stack Overflow用户
提问于 2013-01-16 23:50:42
回答 3查看 10.6K关注 0票数 2

我连接到一个DB2数据库并执行SQL语句。

正在做的一个例子是:

代码语言:javascript
复制
select field from library/file
  [program code line finishes executing]
  [increment value by one]
update library/file set field = 'incremented value'

我需要在返回值的同时立即更新值。而不必等待脚本完成,然后运行单独的UPDATE语句。

我想做的概念是:

代码语言:javascript
复制
select field from library/file; update library/file set field = (Current Value + 1); go;

请注意。这不是大多数人所熟悉的普通SQL数据库,它是IBM上的DB2数据库。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-17 04:34:14

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 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,因此我们将其初始化为更高的值)。

代码语言:javascript
复制
CREATE SEQUENCE InvoiceSeq
    as decimal (7,0)
    start with 27000; -- for example

您可以获得一个新发票的编号,如下所示:

代码语言:javascript
复制
SELECT NEXT VALUE FOR InvoiceSeq
    INTO :myvar
    FROM SYSIBM/SYSDUMMY1;

但是这个SYSIBM/SYSDUMMY1表是什么呢?我们实际上没有从表中得到任何东西,那么为什么我们要假装这样做呢?SELECT需要一个FROM-table子句。但既然我们不需要它,就让我们使用VALUES INTO语句。

代码语言:javascript
复制
VALUES NEXT VALUE FOR InvoiceSeq
    INTO :myvar;

所以这增加了计数器,并将值放入我们的变量。您可以使用该值插入到InvoiceHeaders和InvoiceDetails表中。

,则可以在编写InvoiceHeader时递增计数器,然后在编写InvoiceDetails时再次使用它。

代码语言:javascript
复制
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);

之前的值是特定作业的本地值,因此应该不会有另一个作业获得相同编号的风险。

票数 4
EN

Stack Overflow用户

发布于 2014-02-13 14:48:35

他的要求是这样的:

代码语言:javascript
复制
UPDATE sometable
SET somecounter = somecounter + 10,
    :returnvar  = somecounter + 10;

同时更新和检索。

这在MSSQL中是可能的,事实上我在那里用得很多,

但是DB2似乎没有这个功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14362354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档