错误: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: 表达式必须与对应的表达式具有相同的数据类型
条件表达式中的 zipmap 函数给出真假结果表达式必须具有一致的类型错误