2011-09-22 40 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

相關問題