Как я могу загрузить данные условно, используя sqlldr в Oracle - PullRequest
1 голос
/ 22 сентября 2011

У меня есть текстовый файл следующим образом.1-й machine_no, 2-й emp_no, 3-й shift_type (1 для входа, 3 для выхода), 4-й work_date, 4-е время.

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,  

Я хочу загрузить данные в таблицу.Поле time1 имеет время, если time_type равно 1, и поле time2, чтобы иметь время, если time_type равно 3. Пожалуйста, дайте мне знать, как это можно получить в контрольном файле.

Заранее спасибо за помощь .. Маки.

Ниже приведены текстовый файл и таблица в oracle.

Таблица выглядит следующим образом:

desc data_trans;

 Name                            Null?    Type
 ------------------------------- -------- ----
 MACHIAN                                  VARCHAR2(4)
 YEAR                                     NUMBER(4)
 MONTH                                    VARCHAR2(2)
 WDAY                                     VARCHAR2(2)
 TIME1                                    VARCHAR2(5)
 TIME2                                    VARCHAR2(5)
 TIME3                                    VARCHAR2(2)
 SHIFT_NO                                 NUMBER(1)
 TIME_TYPE                                NUMBER(1)
 WORK_DATE                                DATE
 EMP_NO                                   VARCHAR2(10)

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Почему бы вам не использовать внешнюю таблицу для чтения этого файла, а затем вы можете просто ВЫБРАТЬ из него и выполнить любое условное преобразование, которое вы хотите легко выполнить в SQL.

N.B. Есть несколько предположений: вы, кажется, взаимозаменяемы с типом time_type и типом shift_type, и есть столбцы таблицы, которых нет в вашем файле данных и т. Д.

-- Create the Oracle directory
CREATE OR REPLACE DIRECTORY file_dir AS '<physical-server-directory-path>';

-- Grant privs on the directory
GRANT READ, WRITE ON DIRECTORY file_dir TO <username>;

-- Create the external table
CREATE TABLE ext_data_table
(machine_no                VARCHAR2(4),
 emp                       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
    BADFILE file_dir :'file.bad'
    LOGFILE file_dir :'file.log'
    DISCARDFILE file_dir :'file.dsc'
     FIELDS TERMINATED BY ','
     (
      machine_no                CHAR(4),
      emp                       CHAR(10),
      shift_type                CHAR(2),
      work_date                 CHAR(10),
      time                      CHAR(5)
     )
   LOCATION (
    FILE_DIR:'<filename>'
   )
  )
  NOPARALLEL;

-- Insert (and transform) your file data
INSERT INTO data_trans
(machian,
 year,
 month,
 wday,
 time1,
 time2,
 time3,
 shift_no,
 time_type,
 work_date,
 emp_no)
SELECT machine_no,              -- machian
       SUBSTR(work_date, 1, 4), -- year
       SUBSTR(work_date, 6, 2), -- month
       SUBSTR(work_date, 9, 2), -- wday
       (CASE TO_NUMBER(shift_type)
           WHEN 1
           THEN time
           ELSE NULL
         END),                  -- time1
       (CASE TO_NUMBER(shift_type)
           WHEN 3
           THEN time
           ELSE NULL
         END),                  -- time2
       NULL,                    -- time3    (You don't specify)
       NULL,                    -- shift_no (You don't specify)
       TO_NUMBER(shift_type),   -- time_type
       TO_DATE(work_date, 'YYYY/MM/DD'), -- work_date
       emp                      -- emp_no
  FROM ext_data_table;

Из приведенной информации это близкое приближение.

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

0 голосов
/ 22 сентября 2011

Это невозможно в SQL * Loader.Используйте Внешнюю таблицу , затем скопируйте ее в реальную таблицу, используя функцию decode для pivot .

...