Oracle 对来自 PostgreSQL 的 unnest 数组的模拟

Oracle's analogue for unnest array from PostgreSQL

我有 table 个子网,例如

cidr | ip

我想 select 通过所属 ip 列表划分子网。在 postgres 中我可以这样做:

select 
    ips.ip, net.uid, net.cidr 
from 
    TBL_SID_SUBNETWORK net, 
    (select unnest(ARRAY[1,2,3]) ip) ips 
where 
    cast (((2^net.cidr) - 1) as bigint)<<(32 - net.cidr) & ips.ip =  net.ipaddress

在 postgres 中,我可以传递数组并将其用作 table。

select ips.ip from
(select unnest(ARRAY[1,2,3]) ip) ips

|ip|
 1
 2
 3

是否可以在 Oracle 中执行类似的操作?在一个查询中?我不想创建、填充和删除额外的 table,因为我间接使用 DB,并且事务由应用程序配置管理。

我知道 Oracle 的 TABLE(collection) 函数,它的作用与我想要的完全相同。但是我不能将集合传递到这个查询中,因为我应该在之前声明和填充集合,这样它与创建临时文件相同 table.

Oracle 具有您可以使用的预定义、记录的集合。例如:

select column_value ip from table(sys.odcinumberlist(1,2,3));

没有一个地方包含所有文档化集合的列表。 This page of the Database Data Cartridge Developer's Guide lists some of the more popular ones, such as ODCIVarchar2List, ODCINumberList, and ODCIDateList. Also, this answer Lukas Eder 使用查询来查找系统集合,尽管并非所有集合都被记录在案。

如果 Oracle 只是提供一些标准集合供大家使用并给它们起个好听的名字就好了。使用 sys.odcinumberlist 是安全的,但它看起来像一个丑陋的 hack。