我的 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
子句......你知道一种方法吗?
答案 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
; first
和last
的文档为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.