[英]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.