УДАЛИТЬ и ВСТАВИТЬ, используя оператор MERGE в ORACLE - PullRequest
0 голосов
/ 30 января 2020

У меня есть объект Employee, и у него есть поле List<String> accountIds.

, поэтому структура таблицы выглядит следующим образом:

CREATE TABLE EMPLOYEE (
ID varchar2(255) not null,
OBJ_ID varchar2(36), 
NAME varchar2(255),
VER_NBR number(19,0),
CREATEID varchar2(255) not null,
CREATETIME timestamp (6) not null,
UPDATEID varchar2(255),
UPDATETIME timestamp (6),
primary key (ID));

, а для хранения AccountIds у меня есть еще одна таблица

CREATE TABLE EMPLOYEE_ACCOUNT_IDS(
        EMP_ID varchar2(255),
        ACC_ID varchar2(255),
        primary key (EMP_ID, ACC_ID)
);

Операция обновления : ACCOUNT_IDS в таблице EMPLOYEE

Прямо сейчас в приложении я удаляю все учетные записи, связанные с сотрудником, и заново вставляю все.

Для повышения производительности и уменьшения количества запросов к базе данных. Возможно ли это сделать с ЗАЯВЛЕНИЕМ "MERGE".

1 Ответ

0 голосов
/ 30 января 2020

Да. Возможно, не уверен, что быстрее, чем удалить и вставить. Я не знаю, как выглядит ваш вклад, поэтому было бы неплохо, как вы выполняете вставку. В любом случае вы можете объединить существующие данные и новые значения и использовать этот запрос в качестве исходной таблицы.

merge into employee_account_ids tgt
using (  
  with new_data(acc_id) as (select * from table(sys.odcivarchar2list('NEW01', 'NEW02', 'ACC13')))
    select '001' emp_id, nvl(a.acc_id, n.acc_id) acc_id, rwd,
           case when n.acc_id is null then 'del' end dsc
      from new_data n 
      full join (select e.*, rowid rwd from employee_account_ids e where emp_id = '001') a 
        on a.acc_id = n.acc_id ) src
on (src.emp_id = tgt.emp_id and src.rwd = tgt.rowid)
when matched then update set tgt.acc_id = tgt.acc_id delete where dsc = 'del'
when not matched then insert values (src.emp_id, src.acc_id)

dbfiddle

Проблема в том, что во второй таблице нет фиктивного столбца, к которому я мог бы прикоснуться, чтобы выполнить удаление, потому что Oracle для обновления строки требуется сначала обновить. Поэтому я использовал rowid, обманутое обновление (tgt.acc_id = tgt.acc_id), и оно работает.

...