使用以下查询,将引发Oracle异常。 但是,我不明白为什么。 任何人都能解释一下吗?

select visit_id, to_date(response, 'DD/MM/YYYY') as convertedDate from 
(
select *
from dat_results_ext
where item_name = 'CALLBACKDATE'
)
where to_date(response, 'DD/MM/YYYY')  > sysdate

我理解异常意味着它试图转换'响应'字段,但它符合非数字。 问题是它应该带回的行具有正确格式的所有内容。

'response'字段是varchar字段,但是带有'item_name ='CALLBACKDATE'子句的所有行都是正确的格式。

有任何想法吗?

#1楼 票数:2 已采纳

优化程序可以在尝试查找最佳执行计划之前重写查询。 在您的情况下,因为您没有任何提示会阻止优化器执行此操作,它可能会取消您的子查询并将您的查询重写为:

SELECT *
  FROM dat_results_ext
 WHERE item_name = 'CALLBACKDATE'
   AND to_date(response, 'DD/MM/YYYY') > sysdate

您无法控制WHERE子句中语句的评估顺序,因此Oracle可能首先在不可转换为日期的行上评估to_date函数,从而导致错误。

我看到两种方法可以强制Oracle按您想要的顺序评估语句:

  1. 使用rownum。 Rownum将实现子查询,防止Oracle将其与外部查询合并:

     SELECT visit_id, to_date(response, 'DD/MM/YYYY') AS convertedDate FROM (SELECT r.*, rownum /* will materialize the subquery */ FROM dat_results_ext r WHERE item_name = 'CALLBACKDATE') WHERE to_date(response, 'DD/MM/YYYY') > sysdate 
  2. 使用NO_MERGE提示

     SELECT visit_id, to_date(response, 'DD/MM/YYYY') AS convertedDate FROM (SELECT /*+ NO_MERGE */ * FROM dat_results_ext WHERE item_name = 'CALLBACKDATE') WHERE to_date(response, 'DD/MM/YYYY') > sysdate 

#2楼 票数:0

必须先评估TO_DATE子句,然后才能确定WHERE子句的真实性。 如果您具有无法在TO_DATE函数中评估的响应值,您将看到错误。

#3楼 票数:0

更确切地说,这是因为某些response值与DD/MM/YYYY的格式掩码不匹配。 例如,如果您的会话设置为DD-MON-YY默认日期格式,请执行以下操作,您将收到错误消息: -

select to_date('17/SEP/2012','DD/MM/YYYY') from dual;
ERROR:
ORA-01858: a non-numeric character was found where a numeric was expected

由于您在月份字段中传递了一个字符,因此Oracle需要一个数字。

  ask by AndyMorton translate from so

未解决问题?本站智能推荐:

3回复

ORA-01858:尝试插入timestamp(0)列时出错

我有以下提到的格式的数据,当我尝试插入表时出现错误 如何将记录成功插入表中?
1回复

动态列名称抛出ORA-01722:无效的数字

这是我实际问题的通用格式。 我正在传递列名,以便根据子标题获得金额。 让我们假设不同子字段表的表XYZ分别按年份排列 现在,正在发生的事情是参数test_column_name不起作用。 当我手动将一些字段放在那里时,它工作正常。 我抛出错误: 我的功能是这样的: 有什么建
1回复

查询抛出“ORA-32033:不支持的列别名”

我无法在Toad中运行以下查询。 我收到错误ORA-32033: unsupported column alias 。 我究竟做错了什么?
1回复

ORA-01446:无法从具有DISTINCT,GROUPBY等的视图中选择或采样ROWID

只是尝试在客户表中插入错误表中未包含的行。 - 视图 -插入语句 我得到的错误是ORA-01446:无法从DISDISCT,GROUP BY等视图中选择ROWID,或从中采样01446。00000-“无法从DISTINCT,GROUP BY等视图中或从示例中选择ROWID ”。
1回复

仅在old=new上进行选择时获取变异表(ORA-04091)

我在使用oracle中的触发器进行简单选择计数时遇到麻烦。 我不断收到ORA-04091: 是select语句导致ORA-04091错误。 我们之前解决此问题的方法是执行PRAGMA AUTONOMOUS_TRANSACTION,但我要摆脱它,因为它会引起其他问题(选择一个自主事务与从
1回复

SQLDeveloperORA-01858:在期望数字的位置找到了非数字字符[重复]

这个问题已经在这里有了答案: 在Oracle SQL中比较日期 5个答案 有一行我无法输入表格 这是我无法输入的唯一行 错误: INSERT INTO CLIENTE VALUES('08798234-9','Luis','Garcia','Ramirez','Mála
1回复

使用OraclePIVOT时使用ORA-00933

我在使用下面的SQL到Oracle Database 10.2.0.1上时遇到oracle错误“ ORA-00933:SQL命令未正确结束”; 如果同一条SQL可以在Oracle Database 11.1.0.7上正常工作,请调查一下并提出问题所在。 提前致谢。
2回复

ORA-07445访问冲突

在oracle上运行大型查询时出现此错误。 有什么建议吗? 我正在使用pl sql版本10.2 我已经注意到该错误是由于创建了一个基于许多表的视图而引起的,当我使用where条件从该视图中选择一个特定参数时出现了该错误。 当我检查日志时,我发现了这个 ora 07445访问冲突