1. 程式人生 > >oracle RAC 11g sqlload 生產表匯入資料(ORA-12899)

oracle RAC 11g sqlload 生產表匯入資料(ORA-12899)

背景:由於即將來臨的雙十一,業務部門(我司是做京東,天貓的簡訊服務),簡訊入庫慢,需要DBA把資料庫sqlload進資料庫。

表結構如下:

MRS VARCHAR2(100),
STATUS VARCHAR2(8),
STATUSTJ VARCHAR2(8),
MMDD VARCHAR2(6),
SN VARCHAR2(20),
ROUTEID NUMBER(4),
RETURNTIME DATE,
RECEIVETIME DATE,
SUBMITTIME DATE,
MTYPE NUMBER(1),
SRSPAN NUMBER,
SPCODE VARCHAR2(21),
BANCHROUTE NUMBER(4),
PROVINCE VARCHAR2(20),
CITY VARCHAR2(20),
USERID NUMBER(10),
SCODE VARCHAR2(25),
UUID VARCHAR2(40)

 

編寫控制檔案:

LOAD DATA
INFILE '/u01/app/oracle/utl/daodata/rrpt/rrp_181108.txt'
APPEND
INTO TABLE S_T_RTNRP_STATUS
FIELDS TERMINATED BY ','
(
MRS,
STATUS,
STATUSTJ,
MMDD,
SN,
RETURNTIME date "YYYY-MM-DD hh24:mi:ss",
RECEIVETIME date "YYYY-MM-DD hh24:mi:ss",
ROUTEID,
SUBMITTIME date "YYYY-MM-DD hh24:mi:ss",
MTYPE,
SRSPAN,
SPCODE,
BANCHROUTE,
PROVINCE,
CITY,
USERID,
SCODE,
UUID
)

 

sqlldr XXX/[email protected] control=SqlLdr2.ctl

報錯如下:

 

 報錯類似如下:

ORA-12899: value too large for column "SMART"."S_T_RTNRP_STATUS"."SCODE" (actual: 32, maximum: 25)

後面修改了表的欄位,有原先varchar(20)改成varchar(50)還是報錯(由於操作時間,未截圖)。

 

懷疑是字符集的問題,經查實,作業系統的字符集是UTF8,而資料庫的字符集是16gbk,匯入的PROVINCE, CITY,欄位為中文(如下圖),後面重新的應用匯出資料,不要這兩個欄位。


SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET')

重新修改控制檔案:

LOAD DATA
INFILE '/u01/app/oracle/utl/daodata/rrpt/rrp_181108.txt'
APPEND
INTO TABLE S_T_RTNRP_STATUS
FIELDS TERMINATED BY ','
(
MRS,
STATUS,
STATUSTJ,
MMDD,
SN,
RETURNTIME date "YYYY-MM-DD hh24:mi:ss",
RECEIVETIME date "YYYY-MM-DD hh24:mi:ss",
ROUTEID,
SUBMITTIME date "YYYY-MM-DD hh24:mi:ss",
MTYPE,
SRSPAN,
SPCODE,
BANCHROUTE,
USERID,
SCODE,
UUID
)

 

sqlldr xxx/xxx  control=SqlLdr2.ctl

後成功匯入30多萬條記錄。