gpt4 book ai didi

SQL/DB2 - 检索值并同时更新/增加

转载 作者:行者123 更新时间:2023-12-02 05:17:48 25 4
gpt4 key购买 nike

我正在连接到 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 形式的表达式。要找出最近的值是什么,请使用 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 表是什么?我们并没有真正从餐 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);

PREVIOUS VALUE 是特定工作的本地值,因此应该没有其他工作获得相同数字的风险。

关于SQL/DB2 - 检索值并同时更新/增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14362354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com