использование sqlldr в Oracle для импорта данных - PullRequest
1 голос
/ 19 сентября 2011

У меня есть текстовый файл следующим образом.1st machine_no, 2nd emp_no, 3rd shift_type (1 для входа, 3 для выхода, также может быть 4 для входа (многократная запись), 5 для выхода (множественный выход), 5-ая рабочая_дата, 6-е время.

001,0000000021,01,2011/06/21,06:50,        
001,0000000026,01,2011/06/21,14:00,        
001,0000000018,01,2011/06/21,07:00,        
001,0000000021,03,2011/06/21,14:00,        
001,0000000018,03,2011/06/21,16:50,        
001,0000000026,03,2011/06/21,16:55,        
001,0000000023,01,2011/06/21,07:20,        
001,0000000023,03,2011/06/21,16:30,        
001,0000000023,01,2011/06/22,07:20,        
001,0000000023,03,2011/06/22,16:30,        
001,0000000023,01,2011/06/23,07:20,        
001,0000000023,03,2011/06/23,16:30, 

Я хочу загрузить данные из txt-файла в таблицу оракулов следующим образом:

EMP_NO WORK_DATE         START_TIME          END_TIME            
------ ------------- ----------------------- -------------------
    26 21-06-2011 00:00:00   21-06-2011 14:00:00 21-06-2011 16:55:00
    18 21-06-2011 00:00:00   21-06-2011 07:00:00 21-06-2011 16:50:00
    23 21-06-2011 00:00:00   21-06-2011 07:20:00 21-06-2011 16:30:00
    23 22-06-2011 00:00:00   22-06-2011 07:20:00 22-06-2011 16:30:00
    23 23-06-2011 00:00:00   23-06-2011 07:20:00 23-06-2011 16:30:00
    21 21-06-2011 00:00:00   21-06-2011 06:50:00 21-06-2011 14:00:00  

Посоветуйте, пожалуйста, какой самый простой и быстрый способ сделать это с помощью кода..

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Глядя на предоставленный вами фрагмент данных, вы должны использовать внешние таблицы, и это должно быть близко:

CREATE TABLE file_table
(machine_no     VARCHAR2(3),
 emp_no         VARCHAR2(10),
 shift_type     VARCHAR2(2),
 work_date      VARCHAR2(10),
 time           VARCHAR2(5)
)
  ORGANIZATION EXTERNAL 
  (
   DEFAULT DIRECTORY file_dir 
    ACCESS PARAMETERS
    (
     RECORDS DELIMITED BY NEWLINE
     FIELDS TERMINATED BY ','
     (
      machine_no     CHAR(3),
      emp_no         CHAR(10),
      shift_type     CHAR(2),
      work_date      CHAR(10),
      time           CHAR(5)
     )
    )
    LOCATION 
    (
     file_dir:'<file_name_including_extension>'
    )
  )
  NOPARALLEL;

Вам нужно будет создать логический каталог оракула, который указывает на каталог физического сервера, где вы можетепоместите файл данных (и по умолчанию внешняя таблица запишет свои журналы в этот каталог),

NB. Я сохраняю поля как VARCHAR2, но вы можете указывать их или указывать их как хотите.Я предпочитаю преобразовывать данные, когда они находятся в БД, вы можете предпочесть сделать это во внешней таблице ...

См. Ответ Кевина Бертона для ссылки на инструкции к внешней таблице.

Надеюсь, это поможет ...

2 голосов
/ 19 сентября 2011

SQLLDR + SQL-скрипт - отличный способ загрузить данные в вашу базу данных.

Однако, если вы используете Oracle 9i и выше, я думаю, что самое простое решение - это использовать внешние таблицы , но вам нужно получить файл в какое-то хранилище, к которому может обращаться база данных, ( общий ресурс samba или смонтированная файловая система NFS)

Существует небольшая разница в производительности между sqlldr и внешними таблицами. (хотя есть разница в том, как они оба обрабатывают нарушения ограничений)

также см .: http://orafaq.com/node/848

...