2017-08-04 64 views
0

我使用SQL * Loader腳本將CSV文件中的值輸入到Oracle表中。在這個表中,有一些字段有NOT NULL限制。在我的CSV文件中,相應的字段是"",我想在這種情況發生時將一個空白字符串放入Oracle表中。oracle表中約束NOT NULL的sqlloader

這是我的控制文件:

LOAD DATA 
    infile 'F:\tar.csv' 
    REPLACE 
    INTO TABLE tar 
    fields terminated by ',' optionally enclosed by '"' 
    TRAILING NULLCOLS 
    (IDTAR , 
DATABACKUP DATE "YYYY-MM-DD", 
PAESE , 
R_ELEM NULLIF (R_ELEM=BLANKS)) 

,這是在日誌文件中的錯誤:

ORA-01400:。不能將NULL插入( 「MY_SCHEMA」, 「焦油」「PAESE 「)

如何通過提供不同的值來避免錯誤?

+0

你是什麼意思的一個空白字符串?一個空字符串與Oracle中的空字符相同,所以你是指一個或多個空白字符?包括您的表格DDL和CSV文件中的示例數據也會有所幫助。 –

+0

一個空字符串與Oracle中的null相同.Ahh !!! 這就是要點! –

+0

[「Oracle數據庫目前將長度爲零的字符值視爲空值,但在未來版本中可能不會如此,並且Oracle建議您不要將空字符串視爲空值。」](https ://docs.oracle.com/database/121/SQLRF/sql_elements005.htm#SQLRF30037) –

回答

1

您可以apply an SQL operator,如NVL(:PAESE, 'XXX')。在引用字段名稱之前注意冒號。原位:

LOAD DATA 
    infile 'gian.csv' 
    REPLACE 
    INTO TABLE tar 
    fields terminated by ',' optionally enclosed by '"' 
    TRAILING NULLCOLS 
    (
    IDTAR, 
    DATABACKUP DATE "YYYY-MM-DD", 
    PAESE "NVL(:PAESE, 'XXX')", 
    R_ELEM NULLIF (R_ELEM=BLANKS) 
) 

隨着一個虛擬表:

創建表焦油( idtar數, databackup日期, PAESE VARCHAR2(10)非空, r_elem VARCHAR2(10) );

和CSV,其中第三和第四線對的nullif()條款尾隨空格:

1,2017-08-01,A,B 
2,2017-08-02,C, 
3,2017-08-03,,  
4,2017-08-04,"",  

然後與該控制文件在運行獲得:

SQL*Loader: Release 11.2.0.4.0 - Production on Fri Aug 4 19:39:23 2017 

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 

Commit point reached - logical record count 4 

和日誌說:

... 
    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
IDTAR        FIRST  * , O(") CHARACTER 
DATABACKUP       NEXT  * , O(") DATE YYYY-MM-DD 
PAESE        NEXT  * , O(") CHARACTER 
    SQL string for column : "NVL(:PAESE, 'XXX')" 
R_ELEM        NEXT  * , O(") CHARACTER 
    NULL if R_ELEM = BLANKS 


Table TAR: 
    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. 
... 

查詢表顯示所有四行都已加載:

set null "<null>" 
select * from tar; 

    IDTAR DATABACKU PAESE  R_ELEM  
---------- --------- ---------- ---------- 
     1 01-AUG-17 A   B   
     2 02-AUG-17 C   <null>  
     3 03-AUG-17 XXX  <null>  
     4 04-AUG-17 XXX  <null>  

顯然將'XXX'替換爲您要使用的實際默認字符串。您說'空白字符串',因此您可以使用"NVL(:PAESE, ' ')"來插入單個空格字符。儘管你不能使用空的字符串,因爲就Oracle而言,它與null是相同的。