如何在oracle中使用sqlldr有条件地加载数据

时间:2011-09-22 09:05:08

标签: oracle sql-loader

我有一个txt文件如下。第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_typetime2,则time_type为1且字段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) 有时间 3.请告诉我如何在控制文件中输入此信息。

先谢谢你的帮助......哎呀。

下面是oracle中的txt文件和表。

表格如下:

{{1}}

2 个答案:

答案 0 :(得分:1)

为什么不使用外部表来读取此文件,然后您可以简单地从中进行SELECT,并在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;

根据给出的信息,这是一个近似值。

希望它有所帮助。

答案 1 :(得分:0)

这在SQL * Loader中是不可能的。使用External Table,然后使用decode功能将其复制到真实表格中pivot