获取VARRAY集合中的元素索引

时间:2017-07-10 14:04:39

标签: sql oracle oracle11g

这可能看起来很简单,但我在文档中找不到答案。

与嵌套表一样,我们可以将TABLE()COLUMN_VALUE伪列用于varrays。

create or replace type NUMBER_ARRAY as VARRAY(10) of NUMBER;

create table TAB_WITH_ARRAY(
  ID    NUMBER,
  VALS  NUMBER_ARRAY)    

insert into TAB_WITH_ARRAY
select 1, NUMBER_ARRAY(1,2)
from dual
union all
select 2, NUMBER_ARRAY(1,2,3,4,5)
from dual

select t.id, c.column_value
from TAB_WITH_ARRAY   t,
     table(t.vals)   c

但是,与嵌套表不同,VARRAY是有序集合类型,我想保留该顺序。有没有办法不仅获取值而且还获取SQL中每个元素的索引?

是的,在我的测试中,输出的顺序是正确的,我可以使用ROW_NUMBER和我的主表的PARTITION BY主键来生成索引,但经验教会我不依赖于排序,除非它是手动指定的。

那么是否有内置的方法来访问数组中元素的索引?

1 个答案:

答案 0 :(得分:1)

使用ROW_NUMBER()分析函数:

SELECT t.id,
       c.COLUMN_VALUE,
       ROW_NUMBER() OVER ( PARTITION BY t.ROWID ORDER BY ROWNUM ) AS idx
FROM   TAB_WITH_ARRAY t
       CROSS JOIN
       TABLE( t.vals ) c