二维数组只有9i才能支持create type mynum is varray(10) of varchar2(20); / create type mytable is varray(10) of mynum; / create procedure pro(p_table in out mytable) as begin for i in 1..10 loop for j in 1..10 loop p_table.extend; p_table(i)(j):=v1; end loop; end loop; end; / 具体实现楼主想吧.
呆了十多分钟,还是用临时表会省时间,用数组实现不了,而且数组也不知怎样让游标返回,或者以下给一个点嵌夸表的例子,看你能否想出更好方法 create or replace type mytabletype as table of number; /create or replace function strtab(p_str in varchar2) return mytabletype as lstr varchar2(1000) default p_str||','; ln number; ldata mytabletype:=mytabletype(); begin loop ln:=instr(lstr,','); exit when (nvl(ln,0)=0); ldata.extend; ldata(ldata.count):=ltrim(rtrim(substr(lstr,1,ln-1))); lstr:=substr(lstr,ln+1); end loop; return ldata; end; /SQL> select * from table(cast(strtab('11,12,13') as mytabletype));COLUMN_VALUE ------------ 11 12 13
/
create type mytable is varray(10) of mynum;
/
create procedure pro(p_table in out mytable)
as
begin
for i in 1..10 loop
for j in 1..10 loop
p_table.extend;
p_table(i)(j):=v1;
end loop;
end loop;
end;
/
具体实现楼主想吧.
但是我在测试的时候,系统报错:ORA-06531,引用未初始化的收集。
另外,我必须返回的是一个游标。
create or replace package defpkg
is
type TCursor is ref cursor;
end defpkg;如下是存储过程
create or replace procedure test(rs out defpkg.TCursor)
is
a1 varchar2(20);
a2 varchar2(20);
a3 varchar2(20);
a4 varchar2(20);
b1 varchar2(20);
b2 varchar2(20);
b3 varchar2(20);
b4 varchar2(20);
begin
a1:='1';
a2:='1';
a3:='1';
a4:='1';
b1:='2';
b2:='2';
b3:='2';
b4:='2';
……
end;
a1、a2、a3、a4以及b1、b2、b3、b4本是不相关的变量,但是现在我想把它们以一个二维表的形式返回:
Col1 Col1 Col1 Col1
---- ---- ---- ----
a1 a2 a3 a4
b1 b2 b3 b4这个二维表我可以以临时表的方式实现,但是我现在希望不用临时表,直接把它们组合了,用一个游标返回。我不清楚就是如何把它们组合并通过游标返回。是否可以结合数组,如何实现,我也迫切希望知道。
谢谢!
create or replace type mytabletype as table of number;
/create or replace function strtab(p_str in varchar2)
return mytabletype
as
lstr varchar2(1000) default p_str||',';
ln number;
ldata mytabletype:=mytabletype();
begin
loop
ln:=instr(lstr,',');
exit when (nvl(ln,0)=0);
ldata.extend;
ldata(ldata.count):=ltrim(rtrim(substr(lstr,1,ln-1)));
lstr:=substr(lstr,ln+1);
end loop;
return ldata;
end;
/SQL> select * from table(cast(strtab('11,12,13') as mytabletype));COLUMN_VALUE
------------
11
12
13
另外,返回的table可不可以有多列,列名是否可以指定?