[英]SQL / DB2 - retrieve value and update/increment simultaniously
我正在連接到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語句。
要增加該值並進行檢索,請使用NEXT VALUE FOR sequence-name
形式的SEQUENCE參考表達式。 要找出最新的值,請使用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);
上一個值是特定作業的本地值,因此不應有其他作業獲得相同編號的風險。
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嘗試該示例 。
他的要求是這樣的:
UPDATE sometable
SET somecounter = somecounter + 10,
:returnvar = somecounter + 10;
同時更新和檢索。
這在MSSQL中是可行的,實際上我在那里大量使用它,
但是DB2似乎沒有此功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.