SQL*加载程序错误-ORA-01722:无效的数字和日期格式图片在转换整个输入字符串之前结束

SQL*Loader error-ORA-01722: invalid number and date format picture ends before converting entire input string

我希望将 100k+ 行从管道分隔文件导入 Oracle 数据库。但是 SQL*Loader 抛出错误。

你能帮我指导一下控制文件有什么问题吗?

CPARTY_ID|TYPE|NAME|SHORT_NAME|ULT_PARENT_CPARTY_ID|CPARTY_GRP_ID|OP_COUNTRY_CODE|INC_COUNTRY_CODE|BIC_ID|CREATED_DATE|CHANGED_DATE|LOGICALLY_DELETED|OP_LOCATION_ID|INC_LOCATION_ID|SIC_ID
10000129|L|Coral Stadia Limited|Coral Stadia Ltd|40987565|8211147|GB|GB|9261|1998-10-14 23:20:15.94|2014-10-28 12:06:54.15|N|286|1832|7941

下面是控制文件

LOAD DATA
INFILE '\ServerName\Big_File\Shared_Path\CP EXTRACT\cparty_extract.dat'
BADFILE '\ServerName\Big_File\Shared_Path\CP EXTRACT\sample.bad'
DISCARDFILE '\ServerName\Big_File\Shared_Path\CP EXTRACT\sample.dsc'
APPEND
INTO TABLE sds_cparty_import
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS
(CPARTY_ID,TYPE,NAME,SHORT_NAME,ULT_PARENT_CPARTY_ID,CPARTY_GRP_ID,OP_COUNTRY_CODE,INC_COUNTRY_CODE,BIC_ID,CREATED_DATE DATE 'YYYY-MM-DD HH24:MI:SS',CHANGED_DATE DATE 'YYYY-MM-DD HH24:MI:SS',LOGICALLY_DELETED,OP_LOCATION_ID,INC_LOCATION_ID,SIC_ID)

错误日志如下:

Record 1: Rejected - Error on table SDS_CPARTY_IMPORT, column CPARTY_ID.
ORA-01722: invalid number

Record 2: Rejected - Error on table SDS_CPARTY_IMPORT, column CREATED_DATE.
ORA-01830: date format picture ends before converting entire input string

Record 3: Rejected - Error on table SDS_CPARTY_IMPORT, column CREATED_DATE.
ORA-01830: date format picture ends before converting entire input string

问题一: 为什么第 1 列有错误:CPARTY_ID? CPARTY_ID 的数据类型是 NUMBER(8).

问题2:CREATE_DATE格式错误?如果不支持小数秒。我们可以跳过导入此列吗?

ORA-01830 日期格式图片

您的日期包含小数秒,oracle DATE 类型不支持。

 1998-10-14   23:20:15.94
'YYYY-MM-DD HH24:MI:SS'

我运行从SQL服务器导入这个问题,它将输出三位数的小数秒(毫秒分辨率)。

为了修复,我不得不在格式字符串中使用未记录的条目来 discard/ignore 小数秒,尽管我对原因没有深入的理解。

SELECT TO_DATE('1998-10-14 23:20:15.94', 'YYYY-MM-DD HH24:MI:SS') from DUAL;
--Fails: ORA-01830: date format picture ends before converting entire input string
SELECT TO_DATE('1998-10-14 23:20:15.94', 'YYYY-MM-DD HH24:MI:SS.##') from DUAL;
--Works: '14-OCT-98'

更多细节,参考这个问题:Skip Characters in Oracle TO_DATE function

ORA-01722 无效数字

对于数字错误,我不明白为什么会这样。

SET SERVEROUTPUT ON
DECLARE
  var NUMBER(8);
BEGIN
  var := TO_NUMBER('10000129');
  DBMS_OUTPUT.put_line('var is now ' || var);
END;

对我来说效果很好。是否可能试图加载 header 行并将 'CPARTY_ID'(第一行)转换为 NUMBER(8)

我怀疑是这种情况,所以使用:

OPTIONS (SKIP=1) --Don't Load Header Row
LOAD DATA
INFILE '\ServerName\Big_File\Shared_Path\CP EXTRACT\cparty_extract.dat'
BADFILE '\ServerName\Big_File\Shared_Path\CP EXTRACT\sample.bad'
DISCARDFILE '\ServerName\Big_File\Shared_Path\CP EXTRACT\sample.dsc'
APPEND
INTO TABLE sds_cparty_import
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS
(CPARTY_ID,TYPE,NAME,SHORT_NAME,ULT_PARENT_CPARTY_ID,CPARTY_GRP_ID,OP_COUNTRY_CODE,INC_COUNTRY_CODE,BIC_ID,CREATED_DATE DATE 'YYYY-MM-DD HH24:MI:SS.##',CHANGED_DATE DATE 'YYYY-MM-DD HH24:MI:SS.##',LOGICALLY_DELETED,OP_LOCATION_ID,INC_LOCATION_ID,SIC_ID)