Oracle SQL Loader用WHEN分句拆分头行正文写入两表报错问题
问题根因
这是SQL Loader多表加载的默认定位规则导致的:同个控制文件下配置多个INTO TABLE块时,SQL Loader默认不会为每个块自动重置字段读取的起始位置到行首,第二个及后续表的字段起始位置会继承上一个块的结束位置,最终引发字段偏移、类型转换报错的问题。
你尝试给第二个表首字段加POSITION(1)的思路是正确的,之所以还出现其他错误,是因为两个INTO TABLE块都需要显式指定首字段从行首开始解析,避免交换顺序后又出现偏移问题。
修复后的控制文件
OPTIONS (READSIZE=512000000,bindsize=512000000,rows=64000, ERRORS=100000) LOAD DATA characterset UTF8 length semantics byte REPLACE INTO TABLE <TABLE_1> WHEN (1:6) != 'HEADER' fields terminated by "|" TRAILING NULLCOLS ( ANNO POSITION(1) INTEGER EXTERNAL, COD_PRODOTTO CHAR(12) "TRIM (:COD_PRODOTTO)", DESCRIZIONE_PRODOTTO CHAR(254) "TRIM (SUBSTRB(:DESCRIZIONE_PRODOTTO,1,254))", COD_PADRE CHAR(12) "TRIM (:COD_PADRE)", FOGLIA CHAR(1) "TRIM (:FOGLIA)", COD_STRUTTURA CHAR(10) "TRIM (:COD_STRUTTURA)", TIPO_STRUTTURA CHAR(10) "TRIM (:TIPO_STRUTTURA)" ) INTO TABLE <TABLE_2> WHEN (1:6) = 'HEADER' fields terminated by "|" TRAILING NULLCOLS ( HEADER POSITION(1) FILLER, ANNO INTEGER EXTERNAL, COD_STRUTTURA CHAR(12) "TRIM (:COD_STRUTTURA)", TIPO_STRUTTURA CHAR(12) "TRIM (:TIPO_STRUTTURA)", TIPO_INVIO CHAR(5) "TRIM (:TIPO_INVIO)", DATA_RICEZIONE "sysdate" )
修改点说明:
- 给<TABLE_1>的第一个字段
ANNO增加POSITION(1)声明,强制该表的字段解析从行首第一个字符开始 - 给<TABLE_2>的第一个字段
HEADER增加POSITION(1)声明,强制该表的字段解析同样从行首第一个字符开始
修改后两个表的字段解析完全独立,不会互相影响位置偏移,WHEN条件匹配到对应行后会按对应表的字段规则从行首开始拆分内容,不会再出现类型转换报错的问题。
内容的提问来源于stack exchange,提问作者antoninus96
相关产品推荐
相关产品推荐

