我正在使用 SQL*Loader 脚本将 CSV 文件中的值输入到 Oracle 表中。在此表中,有具有
NOT NULL
约束的字段。在我的 CSV 文件中,相应的字段是""
,我想在发生这种情况时将一个空白字符串放入 Oracle 表中。
这是我的控制文件:
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"."TAR"."PAESE")
如何通过提供不同的值来避免错误?
您可以应用SQL运算符,例如
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)
)
带有虚拟表:
创建表 tar ( 编号, 数据备份日期, paese varchar2(10) 不为空, r_elem varchar2(10) );
和 CSV,其中第 3 行和第 4 行的尾部空格用于
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, ' ')"
来插入一个空格字符。但是,您不能使用 empty 字符串,因为就 Oracle 而言,它与 null 相同。