繁体   English   中英

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

[英]How to update multiple rows with the same sequence value

我正在使用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语句中执行此操作-有什么想法吗?

如果您始终想将'previous'序列值放在更新为'next'next值的那一行之后的两行中,则可以使用复合触发器,类似于以下内容(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数据时发生。

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

分享并享受。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM