从SQL Server(SSIS)引用视图时出现ORA-01858错误

时间:2020-03-06 19:09:30

标签: sql sql-server oracle ssis etl

我们正在从SQL Server SSIS包中调用Oracle视图。当我们从SSIS引用此视图时,我们收到以下ORA-01858错误。该视图在Oracle中没有访问任何问题。

ORA-01858:在需要数字的地方找到了非数字字符

我已经缩小到我们从varchar2 flex字段引入数据的列,如下所示。这个varchar2字段存储的是日期,我正在进行如下所示的转换。 Oracle对此没有任何问题。自从开始从SQL Server调用此错误以来,我们一直在遇到此错误。

to_char(to_date(substr(wdj.dff_detail,1,9)),'YYYYMM')

谢谢。

1 个答案:

答案 0 :(得分:1)

我们缺少一些关键信息:您究竟将什么存储到该列中?我知道,它是代表日期值的字符串,但是-哪种格式?

查看您发布的代码,看来日期值占据了该字符串的前9个字符,所以我假定dd-mon-yy

如果是这样,那么请看以下示例:

SQL> alter session set nls_date_language = 'english';

Session altered.

SQL> with wdj (dff_detail) as
  2    (select '06-mar-20 20:31' from dual union all
  3     select '25-aug-19 13:30' from dual
  4    )
  5  select
  6                    substr(dff_detail, 1, 9)                          sbstr,
  7            to_date(substr(dff_detail, 1, 9), 'dd-mon-yy')            dsbstr,
  8    to_char(to_date(substr(dff_detail, 1, 9), 'dd-mon-yy'), 'yyyymm') ymdbstr
  9  from wdj;

SBSTR                                DSBSTR   YMDBST
------------------------------------ -------- ------
06-mar-20                            06.03.20 202003
25-aug-19                            25.08.19 201908

SQL>
  • 第1-4行:示例数据
  • 第6行:前9个字符的子字符串
  • 第7行:使用适当的格式掩码将子字符串转换为日期!这就是您在代码中所错过的
  • 第8行:以yyyymm格式显示日期(通过to_char函数)

当然,如果任何值都没有遵循我假定的格式(例如mar-06-20),如果包含无效值(例如68-abc-83)等,则不会起作用。

结论?不要将日期存储为字符串。