2011-09-22 101 views
1

我有一个txt文件,如下所示。第一machine_no,第二emp_no,第三shift_type(1进入,3为出口),第四work_date,第四是时间。如何在oracle中有条件地使用sqlldr加载数据

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.请让我知道如何在控制文件中有这个。

在此先感谢您的帮助......麦基。

下面是TXT文件和表格在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) 

回答

1

你为什么不使用外部表来读取这个文件,那么你可以简单地从它选择和执行要容易在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

对不起,我以前没有提到我使用Oracle 8i,我不能使用外部表。我将数据加载到oracle的tmp表中,这就是它的外观。 – Macky

+0

OK,在这种情况下,你看到的这篇文章:http://www.oracle-base.com/articles/8i/DIYDynamicViews.php – Ollie

+0

你应该尽量让你到北美经销商从8i的升级,它已经不再支持了很长时间。 – Ollie

相关问题