2014-02-18 20 views
0

我有一個問題。當我從Windows客戶端運行它時,我有這個控制文件可以正常工作。但是,當我直接在Linux中運行它時,它顯示加載完成,但是當我查看我的oracle數據時,沒有數據,甚至有不良記錄。下面是我的控制文件,在Windows中運行良好,但在Linux中失敗。 注:控制文件工作,如果我刪除字符串或日期轉換領域在UNIX中運行sqlldr控制文件

控制文件

load data 
infile 'HOME/INPUT/FILEA.dat' 
badfile 'HOME/BAD/FILEA.bad' 
discardfile 'HOME/DIS/FILEA.dsc' 
truncate  
into table TEST 
fields terminated by '|' 
trailing nullcols 
(ABCcode CHAR(11),  
ABCID CHAR(6),  
ABC_SEQNO "to_number(:ABC_SEQNO,'999999')",  
PSNO "to_number(:PSNO,'99999999999.999')",  
ABDF CHAR(1),  
ABCFI CHAR(1),  
ABC_DATE NULLIF ABC_DATE="00000000" "to_date(:ABC_DATE, 'YYYYMMDD')",  
XZY_date NULLIF XZY_date="00000000" "to_date(:XZY_date, 'YYYYMMDD')",  
DESC CHAR(1)) 

任何幫助或想法,讓這個代碼運行在Linux上可以理解

有關日誌文件的注意事項:日誌文件有以下內容
ORA-00604:遞歸SQL級別1發生錯誤
ORA-12899:值太大,列 「ABCschema」 「TEST」 「ABC_DATE」。(實際:9,最大:8)
另外,日期轉換具有下列
NULL如果ABC_DATE = 0X3030303030303030(字符'00000000')列 SQL字符串: 「TO_DATE(:ABC_DATE, 'YYYYMMDD')」

+0

你嘗試生成日誌文件?如果是,那麼錯誤是什麼?如果不是,爲什麼? – mustaccio

+0

我做了,我只是更新了我的帖子,以反映我從日誌文件得到的消息 – user2008558

+0

是的,我實際上將數據從Windows移動到Linux – user2008558

回答

0

TEST表中有定義爲VARCHAR2(8)ABC_DATE列,而不是作爲一個DATE

如果我創建一個表:

create table test (
    ABCcode VARCHAR2(11), 
    ABCID VARCHAR2(6), 
    ABC_SEQNO NUMBER, 
    PSNO NUMBER, 
    ABDF VARCHAR2(1), 
    ABCFI VARCHAR2(1), 
    ABC_DATE DATE, 
    XZY_date DATE, 
    "DESC" VARCHAR2(1) 
); 

,並有一個數據文件,:

A|B|1|2.3|C|D|20140217|20140218|E 

然後它加載的罰款。如果我重新創建表:

create table test (
    ABCcode VARCHAR2(11), 
    ABCID VARCHAR2(6), 
    ABC_SEQNO NUMBER, 
    PSNO NUMBER, 
    ABDF VARCHAR2(1), 
    ABCFI VARCHAR2(1), 
    ABC_DATE VARCHAR2(8), 
    XZY_date DATE, 
    "DESC" VARCHAR2(1) 
); 

...那麼同樣的控制文件和數據文件,現在給我:

Record 1: Rejected - Error on table TEST, column ABC_DATE. 
ORA-12899: value too large for column "<schema>"."TEST"."ABC_DATE" (actual: 9, maximum: 8) 

你的字符串值轉換爲日期,但你」當它實際上將數據插入到VARCHAR2列時,重新執行隱式轉換回字符串。當它確實使用了你的NLS_DATE_FORMAT設置,並且我得到的錯誤來自設置爲DD-MON-RR

真有三種選擇。要麼修改您的表格以具有實際的DATE列;或改變控制文件,所以它只是插入純文本值和沒有做的日期轉換在所有;或按摩你的環境,這樣轉換回一個字符串得到你想要的字符串的格式。

只有第一個是真懂事 - 如果它是一個日期值,它總是存儲爲DATE,從來沒有作爲一個字符串。

0X30...的事情是沒有問題的,這只是顯示它使用的內部表示。

+0

快速的問題,你直接從Linux或從Windows環境加載它 – user2008558

+0

@ user2008558 - Linux。但這是關於你的數據庫和表,你的Db環境,而不是操作系統。 –

+0

謝謝亞歷克斯。你是絕對正確的。我剛剛意識到數據屬性已被修改爲VARCHAR2。現在控制文件的工作謝謝你的幫助。 – user2008558