2015-08-21 7 views
0

У меня есть список 100k идентификаторов в файле. Я хочу, чтобы перебирать эти идентификаторы:Вставить или обновить таблицу

для каждого id, проверьте id в таблице:

  • Если, обновить его updated_date флаг
  • Если нет, добавить новую запись (id, updated_date)

Я исследовал и нашел статью MERGE. Недостатком является то, что MERGE требует, чтобы идентификаторы находились в таблице. Мне разрешено создавать временную таблицу, если это необходимо.

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

merge into MyTable x 
using ('111', '222', all my ids) b 
    on (x.id = b.id) 
when not matched then 
    insert (id, updated_date) values (b.id, sysdate) 
when matched then 
    update set x.updated_date = sysdate; 

EDIT: Теперь я могу использовать временную таблицу, если это мой единственный вариант.

+0

Привет, создайте внешнюю таблицу с этим файлом длиной 100 КБ. Затем запросите эту внешнюю таблицу в использовании предложения вашего оператора слияния и сравните с идентификатором mytable. – Buddi

ответ

1

Учитывая, что вы говорите, что вы не можете создать временную таблицу, один из способов могут быть, чтобы преобразовать список идентификаторов в набор профсоюзной all'd выбирает, например:

123, 
234, 
... 
999 

становится

select 123 id from dual union all 
select 234 id from dual union all 
... 
select 999 id from dual 

вы можете затем использовать это в своем заявлении слияния:

merge into MyTable x 
using (select 123 id from dual union all 
     select 234 id from dual union all 
     ... 
     select 999 id from dual) b 
on (x.id = b.id) 
when not matched then insert (id, updated_date) values (b.id, sysdate) 
when matched then update set x.updated_date = sysdate; 

Если вы действительно получили 100k идентификаторов, это может тот Однако, чтобы проанализировать заявление, однако! Возможно, вы захотите разделить запросы и несколько операторов слияния.

Еще одна мысль - нет ли существующего GTT, который вы могли бы «занять» для хранения ваших данных?

1

Если у вас есть доступ к файлу с вашего сервера Oracle, вы можете определить внешнюю таблицу, которая позволит вам читать из файла с помощью SQL.

Синтаксис основан на SQL * Loader, и, возможно, это не то, что вы хотели бы сделать для случайной работы, а скорее из повторяющейся задачи.

В качестве альтернативы вы можете использовать сам SQL * Loader для загрузки его в таблицу или даже ODBC из Microsoft Access или аналогичной базы данных.

Другой вариант - запустить 100 000 вставок. Вы можете сделать это работать гораздо лучше, принимая каждые 100 или около вставки и упаковки их в анонимном блоке, что позволяет экономить туда и обратно в базу данных, поэтому вместо того, чтобы:

insert into tmp values(1); 
insert into tmp values(12); 
insert into tmp values(145); 
insert into tmp values(234); 
insert into tmp values(245); 
insert into tmp values(345); 
.... 
insert into tmp values(112425); 

использования ...

begin 
    insert into tmp values(1); 
    insert into tmp values(12); 
    insert into tmp values(145); 
    insert into tmp values(234); 
    ... 
    insert into tmp values(245); 
end; 
/
begin 
    insert into tmp values(345); 
    ... 
    insert into tmp values(112425); 
end; 
/

Если бы это была обычная задача, я бы определенно пошел за внешней таблицей.

+0

Это просто одноразовый. работа. Я пишу сценарий, отправляю его в администраторы баз данных и запускаю его. – TheCoder

Смежные вопросы