我有带有集合类型列的递归 CTE(sys.ku$_vcnt
这里使用它是因为它是内置的,任何集合类型都可以重现问题)。当集合列用于 CTE inwhere
子句的递归部分时,查询失败并ORA-00932: inconsistent datatypes: expected UDT got SYS.KU$_VCNT
出现错误。
where
这是最小化的示例,在实际情况下,在子句中检查集合内容。任何收集的出现似乎都足以使查询失败 - 例如非空检查,如下例所示:
with r (l, dummy_coll, b) as (
select 1 as l, sys.ku$_vcnt(), null from dual
union all
select l + 1
, r.dummy_coll
, case when r.dummy_coll is not null then 'not null' else 'null' end as b
from r
where l < 5 and r.dummy_coll is not null
)
select * from r;
如果and r.dummy_coll is not null
从where
子句中删除,则查询成功。子句中出现集合select
没有问题(该b
列显示集合实际上不为空)。
为什么它不起作用以及如何强制 Oracle 从where
子句中的先前递归级别查看集合列?
在 Oracle 11 和 Oracle 18 ( dbfiddle ) 中重现。
谢谢!