使用Microsoft Connector for Oracle v1.2的SSIS包遇ORA-01861错误求助
解决SSIS使用Microsoft Connector for Oracle v1.2时的ORA-01861错误
错误原因
问题出在TO_DATE(sysdate, get_date_format)这行代码:sysdate本身是DATE类型,Oracle会先把它隐式转成字符串(基于当前会话的NLS_DATE_FORMAT),再用get_date_format指定的格式转DATE。当Microsoft Connector for Oracle v1.2默认的会话NLS_DATE_FORMAT和get_date_format返回的格式不匹配时,就会触发ORA-01861错误。旧版Oracle ODBC驱动的默认NLS_DATE_FORMAT刚好和目标格式一致,所以没有问题。
SSIS端规避方案
1. 调整连接管理器的NLS_DATE_FORMAT参数
在SSIS的Oracle连接管理器中:
- 右键连接管理器 → 选择Properties
- 在All Properties列表里找到
NLS_DATE_FORMAT,设置为get_date_format函数返回的格式(比如如果函数返回'YYYY-MM-DD HH24:MI:SS',就填这个值) - 保存后重新测试数据流预览
2. 切换回Oracle ODBC驱动
既然旧版ODBC驱动可以正常工作,直接替换数据源类型:
- 在Windows ODBC数据源管理器中,用Oracle ODBC Driver创建新的系统/用户DSN
- 在SSIS包中删除原Microsoft Connector连接,新建ODBC连接管理器指向刚才创建的DSN
- 数据流中替换为ODBC源组件,调用目标视图即可
3. 预设置会话日期格式
通过SSIS的执行SQL任务先调整会话格式,再执行数据流:
- 在数据流任务前添加执行SQL任务,连接到Oracle
- 执行SQL语句:
ALTER SESSION SET NLS_DATE_FORMAT = (SELECT get_date_format FROM DUAL); - 确保执行SQL任务成功后再触发数据流任务
Oracle端包装方案(无需修改原视图)
创建一个包装视图,修正日期处理逻辑,避免隐式转换问题:
CREATE OR REPLACE VIEW WRAP_YOUR_VIEW AS SELECT -- 替换有问题的日期字段,显式转换字符串再转日期 TO_DATE(TO_CHAR(sysdate, get_date_format), get_date_format) AS PROBLEM_DATE_COL, -- 保留其他所有字段 COL1, COL2, COL3, ... FROM YOUR_ORIGINAL_VIEW;
之后SSIS直接调用这个包装视图即可。原理是先显式用get_date_format把sysdate转成对应格式的字符串,再用同样格式转DATE,彻底规避会话格式不匹配的问题。
内容的提问来源于stack exchange,提问作者sethchev
相关产品推荐
相关产品推荐

