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

'다음'다음 값으로 업데이트 한 후 '이전'시퀀스 값을 두 행에 넣으려고한다는 것을 항상 알고 있다면 다음과 유사한 복합 트리거를 사용할 수 있습니다 (오라클 구문) 용서하십시오

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 개의 ID가 있지만 더 큰 쿼리의 일부로이 쿼리를 실행할 때 1에서 많은 수를 나타냅니다. – Garret

관련 문제