Oracle 12c - 遇到KUP-04026:字段对于数据类型来说太长了

时间:2017-02-15 05:26:49

标签: oracle oracle12c

我有一个外部表,它从CSV文件读取并在某些行上失败。

外部表定义:

E_ID       NUMBER
A_IND      VARCHAR2 (3 Byte)
B_IND      VARCHAR2 (3 Byte)
E_DATE     DATE
E_AMT      NUMBER
F_DATE     DATE
D_E_DATE   DATE

当我从外部表中选择*时,我从日志文件中看到以下信息。

KUP-05004:   Warning: Intra source concurrency disabled because parallel select was not requested.

Field Definitions for table EXTERNAL_TABLE_XTL
  Record format DELIMITED BY NEWLINE
  Data in file has same endianness as the platform
  Rows with all null fields are accepted

  Fields in Data Source:

    E_ID                        CHAR (255)
      Terminated by ","
      Enclosed by """ and """
      Trim whitespace same as SQL Loader
    A_IND                     CHAR (255)
      Terminated by ","
      Enclosed by """ and """
      Trim whitespace same as SQL Loader
    B_IND                    CHAR (255)
      Terminated by ","
      Enclosed by """ and """
      Trim whitespace same as SQL Loader
    E_DATE                   CHAR (10)
      Date datatype DATE, date mask MM/DD/YYYY
      Terminated by ","
      Enclosed by """ and """
      Trim whitespace same as SQL Loader
    E_AMT                    CHAR (255)
      Terminated by ","
      Enclosed by """ and """
      Trim whitespace same as SQL Loader
    F_DATE                   CHAR (10)
      Date datatype DATE, date mask MM/DD/YYYY
      Terminated by ","
      Enclosed by """ and """
      Trim whitespace same as SQL Loader
    D_E_DATE               CHAR (10)
      Date datatype DATE, date mask MM/DD/YYYY
      Terminated by ","
      Enclosed by """ and """
      Trim whitespace same as SQL Loader
KUP-04021: field formatting error for field D_E_DATE
KUP-04026: field too long for datatype
KUP-04101: record 56 rejected in file /home/TEST.csv
KUP-04021: field formatting error for field D_E_DATE
KUP-04026: field too long for datatype
KUP-04101: record 61 rejected in file /home/TEST.csv
KUP-04021: field formatting error for field D_E_DATE
KUP-04026: field too long for datatype
KUP-04101: record 70 rejected in file /home/TEST.csv 

该文件已通过FileZilla传输到服务器。从阅读其他帖子我想也许是因为文件是以二进制模式传输的(它最初是在自动设置下)并且可能还有一些非打印字符。所以我尝试使用ASCII设置进行传输,但这不起作用。然后我尝试删除导致错误的其中一行并手动重新键入。那也行不通。

样本数据失败:

5560000,N,Y,,24950,10/12/2011,10/27/2011
5550001,Y,Y,11/26/2013,73813,11/18/2013,11/29/2013
5560002,Y,Y,11/6/2015,22041.28,11/6/2015,11/18/2015
5560003,Y,Y,10/10/2012,2768.66,10/10/2012,10/24/2012
5560004,N,Y,,29750,9/30/2013,10/15/2013
5560005,Y,Y,10/8/2015,76474.84,10/8/2015,10/21/2015
5560006,N,Y,,63879.28,11/16/2011,11/30/2011
5560007,N,Y,,100000,11/14/2013,11/21/2013

成功的样本数据:

5560008,Y,N,11/1/2010,,,
5550009,Y,N,,,,
5550010,N,N,,,,
5550011,N,N,,,,
5560012,Y,Y,2/12/2016,50000,2/12/2016,2/23/2016
5560013,Y,N,7/22/2011,,,

我的第一个假设是由于某种原因,字段D_E_DATE不接受两位数的月份。请注意,这在开发环境中是成功的,但不是生产,两者都是相同的数据库版本。

2 个答案:

答案 0 :(得分:0)

以下对我来说很好。

表定义:

CREATE TABLE my_data (
E_ID       NUMBER,
A_IND      VARCHAR2 (3 Byte),
B_IND      VARCHAR2 (3 Byte),
E_DATE     DATE,
E_AMT      NUMBER,
F_DATE     DATE,
D_E_DATE   DATE
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY MY_DIR
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (
  E_ID,   
A_IND,  
B_IND,
E_DATE date 'MM/DD/YYYY',
E_AMT,  
F_DATE date 'MM/DD/YYYY',
D_E_DATE date 'MM/DD/YYYY'
    )
  )
  LOCATION ('data.txt')
);

样本数据:

[oracle@ora12c Desktop]$ cat data.txt 
5560000,N,Y,,24950,10/12/2011,10/27/2011
5550001,Y,Y,11/26/2013,73813,11/18/2013,11/29/2013
5560002,Y,Y,11/6/2015,22041.28,11/6/2015,11/18/2015
5560003,Y,Y,10/10/2012,2768.66,10/10/2012,10/24/2012
5560004,N,Y,,29750,9/30/2013,10/15/2013
5560005,Y,Y,10/8/2015,76474.84,10/8/2015,10/21/2015
5560006,N,Y,,63879.28,11/16/2011,11/30/2011
5560007,N,Y,,100000,11/14/2013,11/21/2013

输出:

SQL> select * from my_date;

      E_ID A_I B_I E_DATE     E_AMT     F_DATE    D_E_DATE
---------- --- --- --------- ---------- --------- ---------
   5560000 N   Y             24950      12-OCT-11 27-OCT-11
   5550001 Y   Y   26-NOV-13 73813      18-NOV-13 29-NOV-13
   5560002 Y   Y   06-NOV-15 22041.28   06-NOV-15 18-NOV-15
   5560003 Y   Y   10-OCT-12 2768.66    10-OCT-12 24-OCT-12
   5560004 N   Y             29750      30-SEP-13 15-OCT-13
   5560005 Y   Y   08-OCT-15 76474.84   08-OCT-15 21-OCT-15
   5560006 N   Y             63879.28   16-NOV-11 30-NOV-11
   5560007 N   Y             100000     14-NOV-13 21-NOV-13

8 rows selected.

答案 1 :(得分:0)

在以下主题中找到了这个问题的答案: Oracle external table date field - works in one DB and not in another

将相同的文件从开发服务器传输到prod服务器似乎解决了这个问题。很奇怪,我希望我更清楚地知道为什么会出现这个问题以及如何解决它。