更新表并返回旧值和新值

时间:2013-08-15 18:15:49

标签: sql db2

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

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

我有办法将原始的accntnum和新的accntnum同时归还给一张桌子吗?

3 个答案:

答案 0 :(得分:2)

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语句中设置值。

答案 1 :(得分:1)

一种可能的解决方案是添加一个额外的列(让我们称之为oldaccntnum),并在进行更新时将旧值分配给该列。 然后在不再需要它时放下它。

答案 2 :(得分:0)

这就是我要做的事情:

-- 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.

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