Oracle 12c - 遇到 KUP-04026:数据类型的字段太长

Oracle 12c - encountering KUP-04026: field too long for datatype

我有一个外部 table,它从 CSV 文件中读取数据,但在某些行上失败了。

外部table定义:

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

我从 select * 从外部 table.

生成的日志文件中看到以下信息
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 不接受两位数的月份。请注意,这在开发环境中是成功的,但不是生产环境,并且两者都是相同的数据库版本。

以下对我来说工作正常。

Table定义:

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.

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

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