У меня есть рекурсивный CTE со столбцом типа коллекции (здесь используется sys.ku$_vcnt
, потому что он встроен, проблема может быть воспроизведена для любого типа коллекции). Когда столбец коллекции используется в рекурсивной части CTE в предложении where
, запрос завершается с ошибкой 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).
Спасибо!