Oracle对PostgreSQL中不需要的数组的模拟

时间:2015-02-04 11:09:47

标签: sql oracle postgresql unnest

我有像

这样的子网的表
cidr | ip

我想通过归属ips列表选择子网。在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中,我可以传递数组并将其用作表格。

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

|ip|
 1
 2
 3

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

我了解Oracle的TABLE(collection)功能,它的功能与我想要的完全相同。但我无法将集合传递给此查询,因为我之前应该声明并填充集合,这样就像创建临时表一样。

1 个答案:

答案 0 :(得分:3)

Oracle拥有您可以使用的预定义的文档集合。例如:

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

没有一个地方包含所有记录的集合的列表。 数据库数据盒式开发人员指南This page列出了一些比较流行的内容,例如ODCIVarchar2ListODCINumberList和{{1} }。此外,Lukas Eder的this answer使用查询来查找系统集合,但并非所有系统都已记录在案。

如果Oracle只是为每个人使用的几个标准集合并给它们好名字,那将是很好的。使用ODCIDateList是安全的,但它看起来像是一个丑陋的黑客。