我正在使用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语句中执行它 - 任何想法?
答案 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>
这是一个相当人为的情况,并对应该更新哪些行做出一些巨大的假设,但也许它会证明是有用的。
分享并享受。