如何在查询中按索引排序Oracle嵌套表类型

时间:2013-05-07 12:41:39

标签: oracle nested

我的 Oracle 嵌套表类型定义如下:

create or replace type Varchar2ArrayType as table of varchar2(4000) ;

我知道如何查询此类型的变量,但我不知道如何返回索引排序的行:

declare

  arr Varchar2ArrayType := Varchar2ArrayType() ;

begin

  arr.extend(3) ;
  arr(1) := 'ZXC' ;
  arr(2) := 'ASD' ;
  arr(3) := 'GHJ' ;

  for rec in (
    select
      column_value
    from
      table(arr)
    order by
      column_value
  ) loop
    dbms_output.put_line(rec.column_value) ;
  end loop ;

end ;
/

在上面的PL / SQL块中,我希望用order by column_value子句替换order by index子句......你知道一种方法吗?

2 个答案:

答案 0 :(得分:0)

不完全确定'return rows'是什么意思,但要以'index'顺序循环它们,你可以从1循环到count

declare
  arr Varchar2ArrayType := Varchar2ArrayType() ;
begin
  arr.extend(3) ;
  arr(1) := 'ZXC' ;
  arr(2) := 'ASD' ;
  arr(3) := 'GHJ' ;

  for i in 1..arr.count loop
    dbms_output.put_line(arr(i)) ;
  end loop ;
end ;
/

ZXC
ASD
GHJ

PL/SQL procedure successfully completed.

你也可以在这里使用for i in arr.first..arr.last loop; firstlast的文档为here。如果你在填充后操作(即删除)集合,那么你需要知道这些函数的行为方式,正如文档所示。

您无法使用select from table语法进行排序,因为arr仅在table()函数中的范围内;它在order by子句中不可见,并且嵌套表中使用的索引值不存在。如果你只是放弃order by子句,那么这些行似乎仍然是由索引排序的,但我不认为这是保证的。

...
  for rec in (select rownum as rn, column_value from table(arr)) loop
    dbms_output.put_line(rec.rn ||':'|| rec.column_value) ;
  end loop ;
...

1:ZXC
2:ASD
3:GHJ

您可以使用pipelined table function返回一个记录类型,如果该列不够健壮,则将索引和值都包含为两列。

答案 1 :(得分:0)

这个问题有点老了,但是万一这可以帮助别人。 您应该能够在行内视图中添加rownum并按该列排序。

declare
  arr vc_coll := vc_coll() ;
begin
  arr.extend(3) ;
  arr(1) := 'ZXC' ;
  arr(2) := 'ASD' ;
  arr(3) := 'GHJ' ;

  for rec in (
  select *
    from (
          select
            column_value,
            rownum rnum
          from
            table(arr)
        ) s
    order by rnum
  ) loop
    dbms_output.put_line(rec.column_value || chr(9) || rec.rnum) ;
  end loop ;
end ;
/


ZXC 1
ASD 2
GHJ 3


PL/SQL procedure successfully completed.