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

标签 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 数据库。

谢谢!

最佳答案

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

要进行设置,请使用 CREATE SEQUENCE声明。

要增加值并检索,请使用 SEQUENCE reference NEXT 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);

先前的值是特定作业的本地值,因此不存在其他作业获得相同编号的风险。

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

相关文章:

sql - 如何编写这个具有挑战性的 SQL (MySQL) 命令?

SQL Group By 仅包含表中先前没有的不同条目

mysql - 哪些 DBMS 提供索引组织表?

SQL Server - 查找订单最多的前 n 个客户

mysql - SQL:如何使用 SQL 查询获取一行中的项目值?

android - SQL 语法错误 Android

Java - Hibernate 和 DB2 - 正确的顺序使用

用于检索不相关记录的元组的 SQL

JQuery 自定义选择 - val() 不起作用

visual-studio-2010 - 如何下载 DB2 Data Server Provider 9.7 for .Net?