如何更新具有相同序列值的多个行
问题描述:
我正在使用DB2并希望更新几行满足我的条件的行,并使用与我的序列中相同的下一个值。 这里是我试过,但作为下一个值是获取每一行这不起作用: -如何更新具有相同序列值的多个行
update dependency dep set vid=NEXT VALUE FOR seq_VID where id in ('8371','8372','8373')
id是主键,seq_VID是一个序列。所以我希望的是,下一个序列值是99,那么99将被设置为所有3行(而不是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'下一个值更新之后的两行中,您可以使用复合触发器,类似于以下甲骨文语法,请原谅):
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数据时发生的'变异表'错误。
这是一个颇为人为的情况,并对应该更新哪些行做出了一些巨大的假设,但也许它会证明是有用的。
分享和享受。
感谢您的洞察力,但是在上面的示例中,列表中有3个ids,但是由于我将此查询作为更大查询的一部分运行,因此这将从1到多个不等。 – Garret 2010-08-11 12:54:22