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
相关产品推荐
相关产品推荐

