错误:ORA-01790:表达式必须具有与相应表达式相同的数据类型

Posted

技术标签:

【中文标题】错误:ORA-01790:表达式必须具有与相应表达式相同的数据类型【英文标题】:Error: ORA-01790: expression must have same datatype as corresponding expression 【发布时间】:2016-06-24 13:50:18 【问题描述】:

运行以下我得到错误Error: ORA-01790: expression must have same datatype as corresponding expression

with x (id, dateN) as
(
select 1, to_date('2015-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') from dual
union all
select id+1, dateN+1 from x where id < 10
)
select * from x

我尝试了不同的转换,例如 to_char、时间戳、+ 间隔“1”天等等,但这个错误不断出现。在 Mssql 上,通过函数 dateadd('dd', 1, dateN) 很容易,但这里不太明显如何实现。

Oracle 数据库 11g 企业版 11.2.0.1.0 - 64 位生产

【问题讨论】:

我认为它是日期,但我也尝试将它作为时间戳。哦,对不起,我弄错了,是dateN。 您是否要生成一系列日期? 我是,每个下一个生成的日期应该比前一天多一天,第一个在第一个选择中生成。 您展示的内容有效(在 11gR2 中;我认为您必须使用它,否则您会得到 ORA-32033);那么你的where 子句中有什么来限制递归?还是您的真实查询还有更多未显示的内容? “任意”是什么意思?它必须有一些限制,否则它会尝试生成未来的每个日期,直到它在 9999-12-31 之后失败。我的意思是,错误似乎出在您未显示的内容中。这(和 vkp 的限制;以及您编辑的版本)在 11.2.0.4 中工作正常。我不记得有这样的错误,虽然递归 CTE 在 11.2.0.1 中是新的,所以有可能......或者你的客户正在破坏它?你在哪里运行这个? 【参考方案1】:

由于您使用的是基本版本,因此它看起来像 11840579。您可以通过强制转换值来解决它 - 这不是必需的,但这对您来说是错误:

with x (id, dateN) as
(
  select 1, cast(to_date('2015-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') as date) from dual
  union all
  select id+1, dateN+1 from x where id < 10
)
select * from x;

在转换中包含额外的元素有点没有意义;无论如何,我个人更喜欢日期文字:

with x (id, dateN) as
(
  select 1, cast(date '2015-05-01' as date) from dual
  union all
  select id+1, dateN+1 from x where id < 10
)
select * from x;

date '2015-01-01'cast(date '2015-05-01' as date) 这两个值是略有不同的类型,具有不同的内部表示,这似乎是导致问题的原因:

select dump(date '2015-05-01', 16) as d1, dump(cast(date '2015-05-01' as date), 16) as d2
from dual;

D1                               D2                             
-------------------------------- --------------------------------
Typ=13 Len=8: df,7,5,1,0,0,0,0   Typ=12 Len=7: 78,73,5,1,1,1,1   

但是,该错误的第二部分是它可能返回错误的结果。如果您无法修补以避免问题,您可以使用较旧的分层查询方法:

select level as id, date '2015-05-01' + level - 1 as dateN
from dual
connect by level < 10;

【讨论】:

现在它可以工作了,但日期按降序排列:2015-05-01 00:00:00.0 2015-04-30 00:00:00.0 2015-04-29 00:00:00.0跨度> 啊是的...您需要阅读 My Oracle Support 上的完整错误描述。除了修补之外,我认为没有解决方法。你可以和你的 DBA 谈谈(如果你有支持合同的话)。 @Dmitrii - 添加了获取日期的替代方法,以防您无法修补此错误。 是的,connect by,收到通知时已经在搜索它了,谢谢。

以上是关于错误:ORA-01790:表达式必须具有与相应表达式相同的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01790: 表达式必须具有与对应表达式相同的数据类型

oracle pl/saql ORA-01790: 表达式必须与对应的表达式具有相同的数据类型

C ++错误:“表达式必须具有整数或枚举类型” [重复]

条件表达式中的 zipmap 函数给出真假结果表达式必须具有一致的类型错误

从 2D 向量创建 1D 向量的函数(错误:表达式必须具有指向对象的指针类型)

编译器错误:函数调用必须在常量表达式中具有常量值