UDT столбцы с массовой загрузкой в ​​Oracle - PullRequest
0 голосов
/ 31 октября 2011

У меня есть таблица со следующей структурой:

create table my_table (
    id integer,
    point Point -- UDT made of two integers (x, y)
)

, и у меня есть файл CSV со следующими данными:

#id, point
1|(3, 5)
2|(7, 2)
3|(6, 2)

Теперь я хочу массово загрузить этот CSV вмоя таблица, но я не могу найти какую-либо информацию о том, как обрабатывать UDT в Oracle sqlldr util.Можно ли использовать утилиту массовой загрузки при наличии столбцов UDT?

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Решил проблему после дополнительных исследований, потому что Oracle SQL * Loader имеет эту функцию, и она используется путем указания column object, следующим было решение:

LOAD DATA
INFILE *
INTO TABLE my_table
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
    id,
    point column object
    (
        x,
        y
    )
)
BEGINDATA
1,3,5
2,7,2
3,6,2
0 голосов
/ 01 ноября 2011

Я не знаю, сможет ли это сделать 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 делать то, что вы хотите.

...