Oracle控制文件如何按SCHOOL字段长度拆分加载数据到两张表
Oracle SQL*Loader 定长数据按条件分流加载控制文件实现方案
需求说明
你需要将定长入站数据按TRIM后SCHOOL字段长度分流:长度≤3的记录存入TABLE1,长度>3的存入SCHOOL字段长度为10的TABLE2,且不修改TABLE1原有结构。
核心实现思路
利用SQL*Loader的多表加载能力,配合WHEN条件判断实现行级分流,先读取SCHOOL字段原始定长内容计算修剪后长度,再匹配对应表插入。
完整控制文件代码
LOAD DATA APPEND -- 匹配SCHOOL修剪后长度≤3的记录插入TABLE1 INTO TABLE TABLE1 WHEN LENGTH(TRIM(:SCHOOL_RAW)) <= 3 TRAILING NULLCOLS ( ROLL POSITION(1:3) CHAR "NVL(TRIM(:ROLL),' ')", NAME POSITION(4:6) CHAR "NVL(TRIM(:NAME),' ')", SCHOOL_RAW POSITION(7:11) CHAR, -- 临时字段:读取原始5位SCHOOL内容用于长度判断 SCHOOL EXPRESSION "NVL(TRIM(:SCHOOL_RAW),' ')", LOCATION POSITION(12:18) CHAR "NVL(TRIM(:LOCATION),' ')" ) -- 匹配SCHOOL修剪后长度>3的记录插入TABLE2 INTO TABLE TABLE2 WHEN LENGTH(TRIM(:SCHOOL_RAW)) > 3 TRAILING NULLCOLS ( ROLL POSITION(1:3) CHAR "NVL(TRIM(:ROLL),' ')", NAME POSITION(4:6) CHAR "NVL(TRIM(:NAME),' ')", SCHOOL_RAW POSITION(7:11) CHAR, SCHOOL EXPRESSION "NVL(TRIM(:SCHOOL_RAW),' ')", LOCATION POSITION(12:18) CHAR "NVL(TRIM(:LOCATION),' ')" )
关键配置说明
- 移除原控制文件中错误的
FIELDS TERMINATED BY "|"配置:你的数据为定长格式,无需指定分隔符,该配置会导致定长位置解析失效。 - 临时字段
SCHOOL_RAW:仅用于读取原始定长位置7-11的内容做长度判断,不会实际插入到目标表中。 - 双
INTO TABLE+WHEN逻辑:同一行数据会依次匹配两个条件,满足对应条件则插入对应表,不会出现重复插入。 - 所有字段显式指定
POSITION:确保定长数据解析不会出现错位。
加载效果验证
执行后数据会完全符合预期:
- TABLE1存入ROLL为100、101、104的3条记录,SCHOOL字段长度均≤3
- TABLE2存入ROLL为102、103的2条记录,SCHOOL字段完整保留原始修剪后的内容
内容的提问来源于stack exchange,提问作者impstuffsforcse
相关产品推荐
相关产品推荐

