Как обновить несколько строк с одинаковым значением последовательности - PullRequest
0 голосов
/ 11 августа 2010

Я использую 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, как в случае с этим).Мой обходной путь - разбить его на отдельные операторы для каждого идентификатора в моем списке, то есть

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, если это возможно, - есть идеи?

1 Ответ

0 голосов
/ 11 августа 2010

Если вы всегда знали, что хотите поместить «предыдущее» значение последовательности в две строки после той, которую вы обновили, с помощью «следующего» следующего значения, вы можете использовать составной триггер, аналогично следующему (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+, чтобы помочь обойти ошибку «мутирующей таблицы», которая возникает, когда триггер пытается ВЫБРАТЬ, ВСТАВИТЬ, ОБНОВИТЬ или УДАЛИТЬ данные в той же таблице, в которой включен триггер. 1009 *

Это довольно надуманная ситуация, в которой делается ряд предположений о том, какие строки следует обновлять, но, возможно, это окажется полезным.

Делись и наслаждайся.

...