其实这样的问题已经有很多人提过了,而恰恰在csdn都能搜索到的。
--创建可以返回纪录集的函数(不传入表名参数)
SQL> create or replace function testrerecordnotabname (tableid in number)
 2  return mytabletype
 3  as
 4    l_data mytabletype :=mytabletype();
 5  begin
 6    for i in (select * from a where id>=tableid)  loop
 7      l_data.extend;
 8      l_data(l_data.count) := myobjectype(i.id,i.doctime,i.name);
 9      exit when i.id = 62;
10    end loop;  
11    return l_data;     
12  end;   
13  /Function created.SQL> commit;Commit complete.--创建可以返回纪录集的函数(可以传入表名参数)
SQL> create or replace function testrerecordtabname (tablename in varchar2,tableid in number)
 2  return mytabletype
 3  as
 4    l_data mytabletype :=mytabletype();
 5    strsql varchar2(50);
 6    type v_cursor is ref cursor;
 7    v_tempcursor v_cursor;
 8    i1 number;
 9    i2 varchar2(50);
10    i3 date;
11  begin
12    strsql := 'select * from ' || tablename || ' where id>=' || tableid;
13    open v_tempcursor for strsql;
14    loop 
15      fetch v_tempcursor into i1,i2,i3;
16      l_data.extend;
17      l_data(l_data.count) := myobjectype(i1,i3,i2);
18      exit when v_tempcursor%NOTFOUND;
19    end loop;  
20    return l_data;     
21  end;   
22  /Function created.SQL> commit;Commit complete.--测试不传表名参数的function(testrerecorenotabname)
SQL> set serveroutput on     
SQL> declare
 2    testre mytabletype :=mytabletype();
 3    i number :=0;
 4  begin
 5    testre := testrerecordnotabname(1);
 6    loop
 7      i := i+1;
 8      dbms_output.put_line(';' || testre(i).x || ';' || testre(i).y || ';' || testre(i).z || ';');
 9      exit when i = testre.count;
10    end loop;
11  end;
12  /
;1;01-7?? -02;aaa;
;2;02-7?? -02;bbb;
;3;03-7?? -02;ccc;
;4;04-7?? -02;ddd;
;5;05-7?? -02;eee;
;6;06-7?? -02;fff;PL/SQL procedure successfully completed.--测试传表名参数的function(testrerecoretabname)
SQL> set serveroutput on     
SQL> declare
 2    testre mytabletype :=mytabletype();
 3    i number :=0;
 4  begin
 5    testre := testrerecordtabname('a',1);
 6    loop
 7      i := i+1;
 8      dbms_output.put_line(';' || testre(i).x || ';' || testre(i).y || ';' || testre(i).z || ';');
 9      exit when i = testre.count;
10    end loop;
11  end;
12  /
;1;01-7?? -02;aaa;
;2;02-7?? -02;bbb;
;3;03-7?? -02;ccc;
;4;04-7?? -02;ddd;
;5;05-7?? -02;eee;
;6;06-7?? -02;fff;
;6;06-7?? -02;fff;PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------------------------------------
利用对象类型通过字符串分析出数据函数:
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
         13SQL> create table bb(id varchar2(2),name varchar2(10));Table createdSQL> insert into bb values('11','张三');1 row insertedSQL> insert into bb values('12','李四');1 row insertedSQL> insert into bb values('13','王五');1 row insertedSQL> select * from bb where id in (select * from table(cast(strtab('11,12,13') as mytabletype)));ID NAME
-- ----------
11 张三
12 李四
13 王五
------------------------------------------------------------------------------------------------------------------