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 “)
如何通过提供不同的值来避免错误?
答
您可以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是相同的。
你是什么意思的一个空白字符串?一个空字符串与Oracle中的空字符相同,所以你是指一个或多个空白字符?包括您的表格DDL和CSV文件中的示例数据也会有所帮助。 –
一个空字符串与Oracle中的null相同.Ahh !!! 这就是要点! –
[“Oracle数据库目前将长度为零的字符值视为空值,但在未来版本中可能不会如此,并且Oracle建议您不要将空字符串视为空值。”](https ://docs.oracle.com/database/121/SQLRF/sql_elements005.htm#SQLRF30037) –