使用Oracle SQLLoader导入CSV遇ORA-00984错误求助
解决SQL*Loader导入时ORA-00984的问题
这个ORA-00984错误的根源很明确:你在控制文件的字段转换表达式里直接引用了列名,而没有用SQL*Loader要求的绑定变量格式。咱们直接来修正并验证:
问题原因
SQL*Loader中,当你要在表达式里引用当前行的字段值时,必须用:字段名的形式(加冒号)。你之前写的substr(DATETIME_OF_BIRTH,1,10)会被Oracle当成表的列名来解析,这就触发了“column not allowed here”的错误。
修正方案
把控制文件中DATETIME_OF_BIRTH的处理语句改成带冒号的绑定变量形式:
修正后的控制文件片段
( ID, NAME, DATETIME_OF_BIRTH "TO_DATE(substr(:DATETIME_OF_BIRTH,1,10),'YYYY-MM-DD')" )
完整示例验证
结合你提到的表结构、控制文件和CSV,我整理了一套可直接测试的完整示例:
1. PERSON表DDL(假设你的表结构类似)
CREATE TABLE PMI_DATA_SPRINT_REPORTER.PERSON ( ID NUMBER PRIMARY KEY, FULL_NAME VARCHAR2(100) NOT NULL, DATETIME_OF_BIRTH DATE );
2. 修正后的完整控制文件(person.ctl)
LOAD DATA INFILE 'person.csv' BADFILE 'person.bad' DISCARDFILE 'person.dsc' INTO TABLE PMI_DATA_SPRINT_REPORTER.PERSON FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( ID, FULL_NAME, DATETIME_OF_BIRTH "TO_DATE(substr(:DATETIME_OF_BIRTH,1,10),'YYYY-MM-DD')", -- 处理空值的可选配置 NULLIF DATETIME_OF_BIRTH = '' )
3. CSV示例文件(person.csv)
1,"Alice Smith","1990-05-15 14:30:00" 2,"Bob Johnson","1985-11-22 09:15:00" 3,"Charlie Brown",""
额外优化建议
如果你的CSV日期格式是固定的YYYY-MM-DD HH24:MI:SS,其实可以不用substr,直接用日期格式匹配转换,效果一样:
DATETIME_OF_BIRTH "TO_DATE(:DATETIME_OF_BIRTH,'YYYY-MM-DD HH24:MI:SS')"
如果只需要日期部分(去掉时分秒),可以再加个TRUNC:
DATETIME_OF_BIRTH "TRUNC(TO_DATE(:DATETIME_OF_BIRTH,'YYYY-MM-DD HH24:MI:SS'))"
执行修正后的控制文件,应该就能成功导入数据了。如果还有问题,可以检查下CSV里的日期格式是否统一,或者有没有特殊字符干扰。
内容的提问来源于stack exchange,提问作者phemor
相关产品推荐
相关产品推荐

