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)
我希望将 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)