2010-08-11 87 views
0

我正在使用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语句执行本 - 任何想法?

回答

0

如果您一直知道您希望将'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数据时发生的'变异表'错误。

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

分享和享受。

+0

感谢您的洞察力,但是在上面的示例中,列表中有3个ids,但是由于我将此查询作为更大查询的一部分运行,因此这将从1到多个不等。 – Garret 2010-08-11 12:54:22