Я не знаю, сможет ли это сделать sqlldr, но лично я бы использовал внешнюю таблицу.
Присоедините файл как внешнюю таблицу (файл должен находиться на сервере базы данных), а затем вставьте содержимое внешней таблицы в таблицу назначения, преобразуя UDT в два значения. Следующий перевод из двойного должен помочь вам с переводом:
select
regexp_substr('(5, 678)', '[[:digit:]]+', 1, 1) x_point,
regexp_substr('(5, 678)', '[[:digit:]]+', 1, 2) y_point
from dual;
UPDATE
В sqlldr вы можете преобразовывать поля, используя стандартные выражения SQL:
LOAD DATA
INFILE 'data.dat'
BADFILE 'bad_orders.txt'
APPEND
INTO TABLE test_tab
FIELDS TERMINATED BY "|"
( info,
x_cord "regexp_substr(:x_cord, '[[:digit:]]+', 1, 1)",
)
Контрольный файл выше извлечет первую цифру в полях, подобных (3, 4), но я не могу найти способ извлечь вторую цифру - т.е. я не уверен, возможно ли иметь такое же поле в входной файл вставлен в два столбца.
Если внешние таблицы для вас не подходят, я бы предложил (1) преобразовать файл перед загрузкой, используя sed, awk, Perl и т. Д. Или (2) SQLLDR файл во временную таблицу, а затем выполнить второй процесс чтобы преобразовать данные и вставить в вашу финальную таблицу. Другой вариант - посмотреть, как генерируется файл - можете ли вы сгенерировать его так, чтобы поле, которое нужно преобразовать, повторялось в двух полях файла, например:
data|(1, 2)|(1, 2)
Может быть, кто-то еще добавит способ заставить sqlldr делать то, что вы хотите.