Ниже приведено одно из простых решений, которое обеспечит отсутствие тайм-аута, и даже вам не нужно сканировать миллионы записей по 100K раз.
Однократная настройка:
Создать промежуточную временную таблицу:
create table a_staging_table(
testvalue1 varchar2(255),
testvalue2 varchar2(255),
testval3 varchar2(255),
testval4 varchar2(255),
testval5 varchar2(255)
);
---- Повторяющийся процесс
Загрузите ваши данные "CSV / TEXT" в промежуточную таблицу:
some_file_name.ctl : этот файл содержит команду загрузки данных ниже.
load data
INFILE 'home/sample/file.csv'
INTO TABLE a_staging_table
APPEND FIELDS TERMINATED BY '|'
(testvalue1,testvalue2,testval3,testval4,testval5);
Теперь запустите загрузчик SQL, чтобы загрузить данные в форму промежуточной таблицы.
sqlldr userid=dbUserName/dbUserPassword control=some_file_name.ctl log=some_file_name.log
Ваши данные загружаются в промежуточные таблицы. Теперь присоединитесь к промежуточной таблице и your_original_table, чтобы определить несуществующую запись.
Первый путь:
Буферизируйте вывод из SQL ниже, используя SQL * PLUS:
select s.testval3,testval5
from (select distinct testval3,testval5
from a_staging_table) s
where not exists
(select 1
from your_original_table
where mycolumn1=s.testval3
and mycolumn2=s.testval5);
Второй способ:
Begin
for x in (
select s.testval3,testval5
from (select distinct testval3,testval5
from a_staging_table) s
where not exists
(select 1
from your_original_table
where mycolumn1=s.testval3
and mycolumn2=s.testval5)
) loop
DBMS_OUTPUT.put_line('testval3: '||x.testval3 || ' ------ '||'testval5: '||x.testval5);
--write all these values into another file saying that these are not matching values, using UTL_FILE.
--Then finally truncate the table "a_staging_table"
--so that this data will not available next time, and next time again process will run with different file
end loop;