Конструкция update в Oracle

Простой UPDATE

g

  1. DROP TABLE t1;
  2.  
  3. CREATE TABLE t1 AS
  4. SELECT #cc66cc;">1 id, #ff0000;">'Москва XXXX' name, #ff0000;">'МСК X' short_name FROM dual
  5. UNION
  6. SELECT #cc66cc;">2 id, #ff0000;">'Саратов XXXX' name, #ff0000;">'САР X' short_name FROM dual
  7. UNION
  8. SELECT #cc66cc;">3 id, #ff0000;">'Орел XXXX' name, #ff0000;">'ОР X' short_name FROM dual;
  9.  
  10. UPDATE t1
  11. SET name = #ff0000;">'Самара'
  12. WHERE id = #cc66cc;">1;
  13.  
  14. commit;

Сложный UPDATE с использованием соединения нескольких таблиц

  1. drop table t1;
  2. drop table t2;
  3.  
  4. -- создаем таблички
  5. create table t1 #b1b100;">AS
  6. SELECT #cc66cc;">1 id, 'Москва XXXX' name, 'МСК X' short_name from dual
  7. union
  8. SELECT #cc66cc;">2 id, 'Саратов XXXX' name, 'САР X' short_name from dual
  9. union
  10. SELECT #cc66cc;">3 id, 'Орел XXXX' name, 'ОР X' short_name from dual;
  11.  
  12. create table t2 #b1b100;">AS
  13. SELECT #cc66cc;">1 id, 'Москва City' name, 'МСК C' short_name from dual
  14. union
  15. SELECT #cc66cc;">2 id, 'Саратов City' name, 'САР C' short_name from dual
  16. union
  17. SELECT #cc66cc;">3 id, 'Орел City' name, 'ОР C' short_name from dual;
  18.  
  19. -- добавляем первичные ключи
  20. ALTER TABLE t1 ADD CONSTRAINT t1_PK PRIMARY KEY (id);
  21. ALTER TABLE t2 ADD CONSTRAINT t2_PK PRIMARY KEY (id);
  22.  
  23. -- Обновляем
  24. UPDATE
  25. (
  26. SELECT t1.name name,
  27. t1.short_name short_name,
  28. t2.name name_new,
  29. t2.short_name short_name_new
  30. FROM t1,
  31. t2
  32. WHERE t1.id = t2.id
  33. ) tt
  34. SET tt.name = tt.name_new, tt.short_name = tt.short_name_new;
  35.  
  36. commit;
  37.  
  38. SELECT * FROM t1;
  39.  

Связка таблиц в 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 должен затрагивать только одну строку. Иначе вернется ошибка.

  1. declare
  2. v_name_up VARCHAR2 (#cc66cc;">100);
  3. begin
  4.  
  5. UPDATE
  6. (
  7. SELECT t1.name name,
  8. t1.short_name short_name,
  9. t2.name name_new,
  10. t2.short_name short_name_new
  11. FROM t1,
  12. t2
  13. WHERE t1.id = t2.id
  14. AND t1.id = #cc66cc;">1
  15. ) tt
  16. SET tt.name = tt.name_new, tt.short_name = tt.short_name_new
  17. returning tt.name into v_name_up;
  18. commit;
  19.  
  20. DBMS_OUTPUT.PUT_LINE(v_name_up);
  21.  
Источники
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
07:41
5.53K
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.