Это похоже на то, что можно эффективно сделать в базе данных (большое противодействие объединению).
Вы можете использовать UTL_FILE , чтобы прочитать файлы и сравнить их непосредственно с вашей справочной таблицей,Вы можете использовать функцию-обертку для непосредственного выбора файла:
CREATE OR REPLACE TYPE tab_varchar AS TABLE OF VARCHAR2(4000);
/
CREATE OR REPLACE FUNCTION select_file(p_dir VARCHAR2, p_file VARCHAR2)
RETURN tab_varchar
PIPELINED IS
l_file utl_file.file_type := utl_file.fopen(p_dir, p_file, 'r', 4000);
l_line VARCHAR2(4000);
BEGIN
LOOP
BEGIN
utl_file.get_line(l_file, l_line);
EXCEPTION
WHEN No_Data_Found THEN
EXIT;
END;
PIPE ROW (l_line);
END LOOP;
utl_file.fclose(l_file);
RETURN;
END;
/
Это позволит вам напрямую выбрать ваши данные, например, это вернет содержимое файла C:\tmp\a.txt
create directory tmp_dir as 'C:\tmp\';
select column_value from table(select_file('TMP_DIR', 'a.txt'));
Отсюда для каждого файла должен быть в порядке один запрос, например:
INSERT INTO ref_table r
(SELECT column_value
FROM table(select_file(:dir, :file_name)
WHERE column_value NOT IN (SELECT ref_value
FROM ref_table
WHERE ref_value IS NOT NULL)
AND column_value IS NOT NULL);