如何使用相同的序列值更新多个行

时间:2010-08-11 11:20:04

标签: sql db2 sql-update sequence

我正在使用DB2,并希望使用我的序列中的相同下一个值更新满足我条件的多个行。 这是我尝试的但是这不起作用,因为为每一行提取下一个值: -

update dependency dep set vid=NEXT VALUE FOR seq_VID where id in ('8371','8372','8373')

id是主键,seq_VID是序列。所以我所希望的是,下一个序列值是99,将为所有3行设置99(而不是99,100,101,就像这样)。 我的解决方法是将其分解为列表中每个id的单独语句,即

update dependency dep set vid=NEXT VALUE FOR seq_VID where id= ('8371')
update dependency dep set vid=PREVIOUS VALUE FOR seq_VID where id= ('8372')
update dependency dep set vid=PREVIOUS VALUE FOR seq_VID where id= ('8373')

但是如果可能的话,我想在一个SQL语句中执行它 - 任何想法?

1 个答案:

答案 0 :(得分:0)

如果您始终知道要将“前一个”序列值放在使用“下一个”下一个值更新的行之后的两行上,则可以使用复合触发器,类似于以下内容(Oracle语法,请原谅):

CREATE OR REPLACE TRIGGER DEPENDENCY_COMPOUND
  FOR UPDATE ON DEPENDENCY
  COMPOUND TRIGGER

  TYPE tDependency_row_table IS TABLE OF DEPENDENCY%ROWTYPE;
  tblDependency_rows  tDependency_row_table := tDependency_row_table();

  AFTER EACH ROW IS
  BEGIN
    tblDependency_rows.EXTEND;
    tblDependency_rows(tblDependency_rows.LAST).ID = NEW.ID+1;
    tblDependency_rows(tblDependency_rows.LAST).VID = seq_VID.CURRVAL;

    tblDependency_rows.EXTEND;
    tblDependency_rows(tblDependency_rows.LAST).ID = NEW.ID+2;
    tblDependency_rows(tblDependency_rows.LAST).VID = seq_VID.CURRVAL;
  END;

  AFTER STATEMENT IS
  BEGIN
    FOR i IN tblDependency_rows.FIRST..tblDependency_rows.LAST LOOP
      UPDATE DEPENDENCY
        SET VID = tblDependency_rows(i).VID
        WHERE ID = tblDependency_rows(i).ID;
    END LOOP;
  END;
END DEPENDENCY_AU;

然后您将发布更新语句为

UPDATE DEPENDENCY
  SET VID = seq_VID.NEXTVAL
  WHERE ID = 8371;

并且触发器应该负责更新其他两行。

复合触发器在Oracle 11+中很有用,可帮助解决“变异表”错误,当触发器尝试在触发器所在的同一个表中执行SELECT,INSERT,UPDATE或DELETE数据时,会发生此错误。 / p>

这是一个相当人为的情况,并对应该更新哪些行做出一些巨大的假设,但也许它会证明是有用的。

分享并享受。