You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:18:01