oracle表中约束NOT NULL的sqlloader

问题描述:

我使用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) –

您可以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是相同的。