2010-08-11 91 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

相關問題