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

SQL Loader固定宽控制文件中CASE语句的正确语法咨询

SQL Loader控制文件中CASE语句的正确语法

在向Oracle加载数据的SQL Loader控制文件中,尝试用CASE语句填充C_TIPO_PRATICA字段时出现报错,原控制文件内容如下:

LOAD DATA
INFILE *
APPEND
INTO TABLE ANAGRAFICA_INDIRIZZI
(
C_BANCA POSITION (1) CHAR(4),
NDG POSITION (5) CHAR(9),
C_TIPO_PRATICA POSITION (14) CHAR(2) "CASE WHEN C_TIPO_PRATICA IS NULL THEN '  ' ELSE C_TIPO_PRATICA END" ,
N_PRATICA POSITION (16) CHAR(8),
C_TIPO_INDIRIZZO POSITION (24) CHAR(1),
N_GUIDA POSITION (25) CHAR(2),
D_RIFERIMENTO POSITION (27) CHAR(10),
S_TOPONIMO POSITION (37) CHAR(25),
S_INTEST_INDIRIZZO POSITION (62) CHAR(40),
N_CIVICO POSITION (102) CHAR(4),
C_CAP POSITION (106) CHAR(5),
S_DESC_COMUNE POSITION (111) CHAR(40),
C_PROVINCIA POSITION (151) CHAR(2),
C_NAZIONE POSITION (153) CHAR(4),
X_TS_INSERT "SYSDATE"
)

报错核心原因是SQL Loader中在字段的SQL转换表达式里引用当前字段值时,必须在字段名前加冒号:,直接写字段名会被解析为数据库表的列名,而非当前加载的字段值。


修改后的正确控制文件

LOAD DATA
INFILE *
APPEND
INTO TABLE ANAGRAFICA_INDIRIZZI
(
C_BANCA POSITION (1) CHAR(4),
NDG POSITION (5) CHAR(9),
-- 给字段名添加冒号前缀,引用当前加载的字段值
C_TIPO_PRATICA POSITION (14) CHAR(2) "CASE WHEN :C_TIPO_PRATICA IS NULL THEN '  ' ELSE :C_TIPO_PRATICA END" ,
N_PRATICA POSITION (16) CHAR(8),
C_TIPO_INDIRIZZO POSITION (24) CHAR(1),
N_GUIDA POSITION (25) CHAR(2),
D_RIFERIMENTO POSITION (27) CHAR(10),
S_TOPONIMO POSITION (37) CHAR(25),
S_INTEST_INDIRIZZO POSITION (62) CHAR(40),
N_CIVICO POSITION (102) CHAR(4),
C_CAP POSITION (106) CHAR(5),
S_DESC_COMUNE POSITION (111) CHAR(40),
C_PROVINCIA POSITION (151) CHAR(2),
C_NAZIONE POSITION (153) CHAR(4),
X_TS_INSERT "SYSDATE"
)

更简洁的替代写法

如果只是处理空值替换,也可以用Oracle的NVL函数简化表达式,效果与CASE语句完全一致:

C_TIPO_PRATICA POSITION (14) CHAR(2) "NVL(:C_TIPO_PRATICA, '  ')"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:10:36