2

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

谢谢!

4

3 回答 3

4

如果此文件只是打算让单行存储您的计数器,请考虑使用 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 是特定工作的本地值,因此不应该有另一个工作获得相同数字的风险。

于 2013-01-16T23:20:11.247 回答
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 对象的信息,或尝试V5R4 中的此示例

于 2013-01-16T20:34:14.363 回答
0

他的要求是这样的:

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

同时更新和检索。

这在 MSSQL 中是可能的,事实上我在那里经常使用它,

但是 DB2 似乎没有这个特性。

于 2014-02-13T06:48:35.003 回答