Конструкция update в Oracle
Простой UPDATE
g
DROP TABLE t1; CREATE TABLE t1 AS UNION UNION UPDATE t1 commit;
Сложный UPDATE с использованием соединения нескольких таблиц
drop table t1; drop table t2; -- создаем таблички create table t1 #b1b100;">AS union union create table t2 #b1b100;">AS union union -- добавляем первичные ключи -- Обновляем UPDATE ( SELECT t1.name name, t1.short_name short_name, t2.name name_new, t2.short_name short_name_new FROM t1, t2 WHERE t1.id = t2.id ) tt SET tt.name = tt.name_new, tt.short_name = tt.short_name_new; commit; SELECT * FROM t1;
Связка таблиц в UPDATE должна проходить по первичным ключам или уникальным индексам. Иначе получим ошибку
SQL Error: ORA-01779: нельзя изменить столбец, кот.отображает non key-preserved таблицу SQL Error: ORA-01779 — «cannot modify a column which maps to a non key-preserved table»
UPDATE через конструкцию MERGE
Описание конструкции merge здесь
Конструкция RETURNING
С ее помощью можно получить обновленное значение поля или полей. Есть ограничение: update должен затрагивать только одну строку. Иначе вернется ошибка.
declare begin UPDATE ( SELECT t1.name name, t1.short_name short_name, t2.name name_new, t2.short_name short_name_new FROM t1, t2 WHERE t1.id = t2.id ) tt SET tt.name = tt.name_new, tt.short_name = tt.short_name_new returning tt.name into v_name_up; commit; DBMS_OUTPUT.PUT_LINE(v_name_up); end;
Источники
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10007.htm
https://ru.stackoverflow.com/questions/541927/%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81-%D0%BF%D1%80%D0%B8-%D0%BD%D0%B0%D0%BB%D0%B8%D1%87%D0%B8%D0%B8-unique-constraint-%D0%B2%D1%8B%D0%B4%D0%B0%D1%91%D1%82-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D1%83-ora-01779-%D0%BD%D0%B5%D0%BB%D1%8C%D0%B7%D1%8F-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C