db2 更新表并返回旧值和新值

gblwokeq  于 2023-01-13  发布在  DB2
关注(0)|答案(3)|浏览(293)

我正在写一个VB应用程序,它正在清理DB2数据库中的一些数据。在一些表中,我想更新整个列。例如,一个帐号列。我正在更改所有帐号,使其从1开始,并在列表中向下递增。我希望能够同时返回旧帐号、和新的一个,这样我就可以生成某种报告,我可以参考,所以我不会失去原始值。

DECLARE @accntnum INT 
SET @accntnum = 0 
UPDATE accounts
SET @accntnum = accntnum = @accntnum + 1
GO

有没有办法在一个表中同时返回原始的accntnum和新的accntnum?

lpwwtiir

lpwwtiir1#

DB2有一个真正的nifty feature,您可以在其中从“数据更改语句”中选择数据,这是在DB2 for Linux/Unix/Windows上测试的,但我认为它至少也应该在DB2 for z/OS上工作。
对于您的编号,您也可以考虑创建一个sequence,然后您的更新将类似于:

CREATE SEQUENCE acct_seq
     START WITH 1
     INCREMENT BY 1
     NO MAXVALUE
     NO CYCLE
     CACHE 24
;

SELECT accntnum  AS new_acct, old_acct
FROM FINAL TABLE (
    UPDATE accounts INCLUDE(old_acct INT)
    SET accntnum = NEXT VALUE FOR acct_seq, old_acct = accntnum
)
ORDER BY old_acct;

INCLUDE部分使用指定的名称和数据类型在结果表中创建一个新列,然后您可以在update语句中设置值,就像设置任何其他字段一样。

wydwbb8l

wydwbb8l2#

一个可能的解决方案是添加一个额外的列(我们称之为oldaccntnum),并在更新时将旧值赋给该列,然后在不再需要时将其删除。

0vvn1miw

0vvn1miw3#

我会这么做:

-- create a new table to track the changes.
    - with columns identifying a unique key, old-vale, new-value, timestamp

-- create a trigger on the accounts table 
   to write the old and new values to the new table.

但是,不知道所有的条件,这可能是不值得的麻烦。

相关问题