如何在SQL*Loader控制文件WHEN子句中使用>或<进行条件筛选?
SQL*Loader筛选REQUEST_DATE大于SYSDATE的正确方法
原控制文件的问题在于:SQL*Loader的WHEN子句仅能对原始输入的字符串字段进行比较,无法直接使用数据库函数SYSDATE,也不能引用经过类型转换后的日期字段(字段转换逻辑在WHEN筛选之后执行)。
下面提供两种可行的解决方案:
方案1:通过参数传递格式化后的当前日期字符串
将当前系统日期转换为和输入文件中REQUEST_DATE一致的字符串格式(DD-MM-YYYY),作为参数传递给控制文件,直接在WHEN子句中做字符串比较(该格式下字符串的大小关系等价于日期的大小关系)。
步骤:
- 生成匹配格式的当前日期字符串(以Linux为例):
export CUR_DATE=$(date +"%d-%m-%Y")
- 修改控制文件,使用参数变量:
LOAD DATA INFILE 'Sample2.dat' APPEND INTO TABLE EMP_LEAVE WHEN REQUEST_DATE > '&CUR_DATE' FIELDS TERMINATED BY "," (REQUEST_NO, EMPNO, REQUEST_DATE DATE "DD-MM-YYYY", START_DATE DATE "DD-MM-YYYY", END_DATE DATE "DD-MM-YYYY", REASON, LEAVE_TYPE, NO_OF_DAYS, APPROVAL )
- 调用SQL*Loader时传递参数:
sqlldr username/password@database control=your_control_file.ctl CUR_DATE='$(date +"%d-%m-%Y")'
方案2:先加载到临时表,再用SQL筛选插入
这种方法更稳妥,适合日期格式复杂或字符串比较可能出错的场景:
- 修改控制文件,将数据先加载到临时表
EMP_LEAVE_TMP:
LOAD DATA INFILE 'Sample2.dat' APPEND INTO TABLE EMP_LEAVE_TMP FIELDS TERMINATED BY "," (REQUEST_NO, EMPNO, REQUEST_DATE DATE "DD-MM-YYYY", START_DATE DATE "DD-MM-YYYY", END_DATE DATE "DD-MM-YYYY", REASON, LEAVE_TYPE, NO_OF_DAYS, APPROVAL )
- 执行SQL语句筛选插入目标表:
INSERT INTO EMP_LEAVE SELECT * FROM EMP_LEAVE_TMP WHERE REQUEST_DATE > SYSDATE; -- 可选:清理临时表 TRUNCATE TABLE EMP_LEAVE_TMP;
内容的提问来源于stack exchange,提问作者John Joy
相关产品推荐
相关产品推荐

