1

我有带有集合类型列的递归 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 nullwhere子句中删除,则查询成功。子句中出现集合select没有问题(该b列显示集合实际上不为空)。

为什么它不起作用以及如何强制 Oracle 从where子句中的先前递归级别查看集合列?

在 Oracle 11 和 Oracle 18 ( dbfiddle ) 中重现。

谢谢!

4

1 回答 1

1

是的,这对我来说就像一个错误。标量选择似乎是一种解决方法。这对你有用吗?

SQL> with r (l, dummy_coll, b) as (
  2    select 1 as l, sys.ku$_vcnt(), null from dual
  3    union all
  4    select l + 1
  5         , r.dummy_coll
  6         , case when r.dummy_coll is not null then 'not null' else 'null' end as b
  7    from r
  8    where l < 5 and ( select r.dummy_coll from dual ) is not null
  9  )
 10  select * from r;

L,DUMMY_COLL,B
1,KU$_VCNT(),
2,KU$_VCNT(),not null
3,KU$_VCNT(),not null
4,KU$_VCNT(),not null
5,KU$_VCNT(),not null
于 2020-06-06T08:08:47.213 回答