1

我有一个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子句......你知道一种方法吗?

4

2 回答 2

2

这个问题有点老了,但万一这对其他人有帮助。您应该能够在内联视图中添加 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.
于 2019-01-14T18:39:49.280 回答
0

不太确定“返回行”是什么意思,但是要按“索引”顺序循环它们,您可以从 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在这里使用;first和文档last这里。如果您在填充集合后操作(即从中删除)集合,那么您需要了解这些函数的行为方式,如文档所示。

您不能使用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

如果不够健壮,您也许可以使用流水线表函数返回包含索引和值作为两列的记录类型。

于 2013-05-07T13:05:00.173 回答