3

我遇到了一个奇怪的问题,将日期列与 SYSDATE 进行比较会产生以下错误:

01858. 00000 -  "a non-numeric character was found where a numeric was expected"
*Cause:    The input data to be converted using a date format model was
           incorrect.  The input data did not contain a number where a number was
           required by the format model.
*Action:   Fix the input data or the date format model to make sure the
           elements match in number and type.  Then retry the operation.

我正在重新创建一个物化视图;其中包括一些小的更改,并且每当进程中止时,它总是指向以下派生表查询中的“>=”:

SELECT id, 
  desc,
  start_date,
  end_date
 FROM T_LIPR_POLICY_ROLE TLPR
 WHERE end_date >= SYSDATE

现在 end_date 是一个 DATE 类型,我实际上可以自己执行这个查询,但是每当我尝试在物化视图中运行它时,它总是会因上述错误而中止。尽管上周我能够使用相同的查询创建它。

有任何想法吗?

谢谢,

4

2 回答 2

1

嗨,我对长时间的延误感到非常抱歉。出于安全原因,我无法发布整个声明。

现在问题已经解决了。问题是我们的物化视图脚本通过 UNION 聚合了来自 17 个不同地方的数据。现在由于某种原因,错误指向错误的代码行(见下文)。

SELECT id, 
 desc,
 start_date,
 end_date
FROM T_LIPR_POLICY_ROLE TLPR
WHERE end_date >= SYSDATE <-- ORACLE POINTS TO THIS LINE

现在这就像脚本中的第十条语句,但错误确实在脚本中的第六条语句中;这显然具有误导性。在此声明中,一条特定记录(数百万)正在尝试以下操作:

to_date('  / 0/    ') <-- This was the cause of the problem.

请注意,此文本在实际脚本中并非如此,它字面意思是 to_date(<varchar 类型的列名>),但 1500 万条记录中有 2 条具有上面指定的文本。

现在我不太明白为什么 Oracle 指向错误的代码行。

¿ 是 Oracle 问题吗?¿ SQL Developer 有问题吗?¿ 会不会与提示冲突?我们像这样使用几个:/*+ PARALLEL (init 4) */

谢谢你的帮助。

于 2013-02-14T13:38:48.217 回答
0

desc 是列名吗?如果是,那么您正在使用 oracle 保留关键字 desc 作为列名。

SELECT id, 
  desc,---- here
  start_date,
  end_date
 FROM T_LIPR_POLICY_ROLE TLPR
 WHERE end_date >= SYSDATE

我们不能在列名中使用 oracle 保留关键字。

请更改列名。

于 2013-02-09T15:47:31.600 回答