在 oracle 表中具有约束 NOT NULL 的 sqlloader

问题描述 投票:0回答:1

我正在使用 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")

如何通过提供不同的值来避免错误?

oracle csv sql-loader
1个回答
1
投票

您可以应用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 相同。

© www.soinside.com 2019 - 2024. All rights reserved.