2017-09-04 93 views
0

我正在嘗試使用SQL加載程序加載數據,但獲取的錯誤率低於此值。SQL加載程序錯誤 - 由於數據錯誤導致行未加載

表被載入 -

CREATE TABLE TEST_PIPE_SEP (FILE_NAME VARCHAR2(3000), KEY_COL VARCHAR2(4000), DESCR VARCHAR2(100), RUN_DATE DATE); 

我創建使用殼牌和SED命令,這樣我可以得到當前處理文件,並把它作爲爲FILE_NAME列默認值動態CTL文件。

#!/bin/ksh 

echo "starting script" 
#cd data 

for i in data/Key_Mismatch_Output_UAT*.csv 
do 

    #echo "$i" 

    filename=`basename "${i}"` 
    echo "$filename" 

    #sed '1d' "$i" >> test.csv 
    sed -e "s/#file_name#/file_name \"${filename}\",/g" test.ctl > new_test_3.ctl 

sqlldr ERRORS=100000 userid=$USER_CRED control=new_test_3.ctl data=data/$filename silent=all log=data/$filename".log" bad=data/$filename.bad skip=1 

wait 
done 
echo "ending script" 

test.ctl的格式如下里面我是用SED通過當前處理的文件名編輯運行時間 -

LOAD DATA   
CHARACTERSET WE8ISO8859P1   
APPEND   
INTO TABLE TEST_PIPE_SEP   
FIELDS TERMINATED BY ','   
(  
#file_name#  
key_col "trim(:key_col)", 
descr "trim(:descr)", 
run_date "SYSDATE" 
) 

將後獲得創建新文件SED稱道的是如下 -

LOAD DATA 
CHARACTERSET WE8ISO8859P1 
APPEND 
INTO TABLE TEST_PIPE_SEP 
FIELDS TERMINATED BY ',' 
( 
file_name "Key_Mismatch_Output_UAT.csv.20170804070448.1_LIVE.csv.20170804070448.2_20170804070448.csv", 
key_col "trim(:key_col)", 
descr "trim(:descr)", 
run_date "SYSDATE" 
) 

的CSV文件及其包含 -

Key Columns,Description 

"C"|"G000053929"|"ABCD"|"G000053929"|""|""|"TTA"|""|""|""|""|""|"DRR"|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|"",Not Present in file1 
"C"|"G000053621"|"HGHQ"|"G000053621"|""|""|"CBI"|""|""|""|""|""|"DRR"|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|"",Not Present in file2 
"C"|"G000053929"|"HGHQ"|"G000053929"|""|""|"TTA"|""|""|""|""|""|"DRR"|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|"",Not Present in file2 

和我得到以下錯誤,無法找到路徑原因試圖改變CTL文件儘可能卻無法加載數據

Table TEST_PIPE_SEP, loaded from every logical record. 
Insert option in effect for this table: APPEND 
  
    Column Name     Position Len Term Encl Datatype   
------------------------------ ---------- ----- ---- ---- --------------------- 
FILE_NAME       FIRST  * ,  CHARACTER    
    SQL string for column : "TRIM('Key_20170804070448.csv')" 
KEY_COL        NEXT  * ,  CHARACTER    
DESCR        NEXT  * ,  CHARACTER    
RUN_DATE        NEXT  * ,  CHARACTER    
    SQL string for column : "SYSDATE" 
  

Table TEST_PIPE_SEP: 

    0 Rows successfully loaded. 
    1 Row not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 

請問我是否需要更多的信息。

我使用

Oracle數據庫11g企業版發佈11.2.0.4.0 - 64位生產

回答

1

據我所知加載與SQLLDR你應該使用這個詞常數的恆定值。所以你的情況,你應該取代

... 
FIELDS TERMINATED BY ',' 
(file_name "Key_Mismatch_Output_UAT.csv.20170804070448.1_LIVE.csv.20170804070448.2_20170804070448.csv", 
... 

... 
FIELDS TERMINATED BY ',' 
(file_name CONSTANT "Key_Mismatch_Output_UAT.csv.20170804070448.1_LIVE.csv.20170804070448.2_20170804070448.csv", 
... 

請讓我知道你的作品(在此期間,我試圖去模仿你的表和你的腳本,如果有必要做更多的測試)

附錄

我使用你的數據做了一個試驗。我確認你應該按照上面的建議使用CONSTANT關鍵字。

此外,我想你應該添加TRAILING NULLCOLS選項,因爲你想用SYSDATE加載run_date。所以,你應該改變

... 
INTO TABLE TEST_PIPE_SEP 
FIELDS TERMINATED BY ',' 
( 
... 

... 
INTO TABLE TEST_PIPE_SEP 
FIELDS TERMINATED BY ',' 
TRAILING NULLCOLS 
( 
... 

CTL用來做我的測試:

LOAD DATA 
CHARACTERSET WE8ISO8859P1 
APPEND 
INTO TABLE TEST_PIPE_SEP 
FIELDS TERMINATED BY ',' 
TRAILING NULLCOLS 
( 
file_name CONSTANT "Key_Mismatch_Output_UAT.csv.20170804070448.1_LIVE.csv.20170804070448.2_20170804070448.csv", 
key_col "trim(:key_col)", 
descr "trim(:descr)", 
run_date "SYSDATE" 
) 

日誌文件SQLLDR:(我裝4行,因爲我又增加了在你的文件中抽樣行(簡單的A,B)。

SQL*Loader: Release 11.2.0.2.0 - Production on Mon Sep 4 15:01:12 2017 
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 
Control File: TEST2.CTL 
Character Set WE8ISO8859P1 specified for all input. 
Data File:  test2.csv 
    Bad File:  test2.bad 
    Discard File: none specified 
(Allow all discards) 
Number to load: ALL 
Number to skip: 1 
Errors allowed: 100000 
Bind array:  64 rows, maximum of 256000 bytes 
Continuation: none specified 
Path used:  Conventional 
Table TEST_PIPE_SEP, loaded from every logical record. 
Insert option in effect for this table: APPEND 
TRAILING NULLCOLS option in effect 
    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
FILE_NAME             CONSTANT 
    Value is 'Key_Mismatch_Output_UAT.csv.20170804070448.1_LIVE.csv.20170804070448.2_20170804070448.csv' 
KEY_COL        FIRST  * ,  CHARACTER    
    SQL string for column : "trim(:key_col)" 
DESCR        NEXT  * ,  CHARACTER    
    SQL string for column : "trim(:descr)" 
RUN_DATE        NEXT  * ,  CHARACTER    
    SQL string for column : "SYSDATE" 

Table TEST_PIPE_SEP: 
    4 Rows successfully loaded. 
    0 Rows not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 

Space allocated for bind array:     55296 bytes(64 rows) 
Read buffer bytes: 1048576 

Total logical records skipped:   1 
Total logical records read:    4 
Total logical records rejected:   0 
Total logical records discarded:  0 

Run began on Mon Sep 04 15:01:12 2017 
Run ended on Mon Sep 04 15:01:12 2017 

Elapsed time was:  00:00:00.09 
CPU time was:   00:00:00.00 

的樣本數據:

Key Columns,Description 
A,B 
"C"|"G000053929"|"ABCD"|"G000053929"|""|""|"TTA"|""|""|""|""|""|"DRR"|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|"",Not Present in file1 
"C"|"G000053621"|"HGHQ"|"G000053621"|""|""|"CBI"|""|""|""|""|""|"DRR"|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|"",Not Present in file2 
"C"|"G000053929"|"HGHQ"|"G000053929"|""|""|"TTA"|""|""|""|""|""|"DRR"|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|""|"",Not Present in file2 
+0

感謝您的回覆ETSA。 我嘗試使用CONSTANT關鍵字,但它給了我同樣的錯誤。 如果是的話,您是否可以成功執行該方案?您是否可以提供您使用的CTL文件示例,是的,我修改了CTL結構以添加TRAILING NULLCOLS。 – mradul

+0

@mradul是的,我成功執行。我添加了CTL到我的答案 – etsa

+0

@mradul添加了log ctl和示例數據(你的另一行) – etsa