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

Простой UPDATE

drop table t1;

create table t1 AS
SELECT 1 id, 'Москва XXXX'  name, 'МСК X' short_name from dual
union
SELECT 2 id, 'Саратов XXXX' name, 'САР X' short_name from dual
union
SELECT 3 id, 'Орел XXXX'    name, 'ОР X'  short_name from dual;

update t1
   set name = 'Самара'
 where id   = 1;

commit;

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

drop table t1;
drop table t2;

-- создаем таблички
create table t1 AS
SELECT 1 id, 'Москва XXXX'  name, 'МСК X' short_name from dual
union
SELECT 2 id, 'Саратов XXXX' name, 'САР X' short_name from dual
union
SELECT 3 id, 'Орел XXXX'    name, 'ОР X'  short_name from dual;

create table t2 AS
SELECT 1 id, 'Москва City' name, 'МСК C' short_name from dual
union
SELECT 2 id, 'Саратов City' name, 'САР C' short_name from dual
union
SELECT 3 id, 'Орел City' name,    'ОР C' short_name from dual;

-- добавляем первичные ключи
ALTER TABLE t1 ADD CONSTRAINT t1_PK PRIMARY KEY (id);
ALTER TABLE t2 ADD CONSTRAINT t2_PK PRIMARY KEY (id);

-- Обновляем
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 
v_name_up VARCHAR2 (100);
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     
   AND t1.id = 1
) 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;
07:41
1935
Нет комментариев. Ваш будет первым!
Загрузка...