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

SQLLDR条件加载时行尾TRL记录无法写入LTD字段问题求助

问题根因

你现有控制文件存在4个核心错误,导致TRL行无法正常加载、且全量数据加载异常:

  • 行首前置空格导致WHEN条件失效:样例数据所有行开头带2个空格,原逻辑判断(1:3) = 'TRL'实际取到的前3位是 T,永远匹配不到TRL标识,TRL行会直接进入第一个INTO块按竖线分隔规则解析,最终因格式不匹配被写入bad文件。
  • 重复REPLACE逻辑冲突:两个INTO TABLE块都配置了REPLACE,第二个块执行时会直接清空第一个块已经写入表的全量数据,最终只会保留最后一个块的加载结果。
  • 普通行字段映射错位:样例中非TRL的数据行仅5个竖线分隔字段,原第一个INTO块定义的字段数量、顺序和实际数据不匹配,会导致普通行字段赋值错乱。
  • TRL行未指定读取起始位置:第二个INTO块没有明确从行首开始读取内容,会因SQL*Loader默认的字段偏移规则截断行首内容,无法拿到完整行值。
修正后可直接使用的控制文件
OPTIONS (SKIP=1)
LOAD DATA 
INFILE '*.TXT'
BADFILE 'A.bad'
-- 加载普通竖线分隔行,仅在此处配置REPLACE
INTO TABLE A
REPLACE
WHEN (3:5) != 'TRL'
FIELDS TERMINATED BY "|" OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(
  ID         FILLER,
  LTD,
  CAGE,
  SUPP       FILLER,
  CNTRY_CODE,
  STATUS     CONSTANT "U",
  RECORD_ID  "S.nextval"
)
-- 加载TRL尾行,移除REPLACE避免清空已加载数据
INTO TABLE A
WHEN (3:5) = 'TRL'
TRAILING NULLCOLS
(
  LTD        POSITION(1) CHAR(300),
  STATUS     CONSTANT "U",
  RECORD_ID  "S.nextval"
)
适配调整说明
  • 如果你的实际数据行开头没有前置空格,把两处WHEN条件的(3:5)改为(1:3)即可。
  • 上面第一个INTO块的字段映射是基于你给出的5字段样例行调整的,如果实际普通数据行的竖线分隔字段更多,按字段顺序补全映射即可,不需要入库的字段标记为FILLER跳过。
  • 正式加载前先在测试表验证,确认普通行字段赋值正确、TRL行完整写入LTD字段后再跑生产数据。

内容的提问来源于stack exchange,提问作者user11789512

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:30:55