代码改变世界

PLSQL的TABEL数据类型总结(转)未完

2015-03-27 14:12  whitecf  阅读(353)  评论(0编辑  收藏  举报

PL/SQL表---table()函数用法:
利用table()函数,我们可以将PL/SQL返回的结果集代替table。

simple example:

1、table()结合数组:

create or replace type t_test as object(
id integer,
rq date,
mc varchar2(60)
);

create or replace type t_test_table as table of t_test;

create or replace function f_test_array(n in number default null) return t_test_table
as 
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
v_test.extend();
v_test(v_test.count) := t_test(i,sysdate,'mc'||i);
end loop;
return v_test;
end f_test_array;


select * from table(f_test_array(10));

/*

2、table()结合PIPELINED函数:

*/

create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED 
as 
v_test t_test_table := t_test_table();
begin 
for i in 1 .. nvl(n,100) loop
pipe row(t_test(i,sysdate,'mc'||i)); 
end loop; 
return; 
end f_test_pipe; 
/

select * from table(f_test_pipe(20));

/*

3、table()结合系统包:

*/

create table test (id varchar2(20));
insert into test values('1');
commit;
explain plan for select * from test;
select * from table(dbms_xplan.display);

 

 

 

-- TABLE 类型的遍历 

--方法一:
declare  
  i integer ; 
  rec_coverage_new gums_package_underwriting.salary_changed_tab;--table类型 
begin 
       rec_coverage_new := gums_package_underwriting.get_salary_changed_info('PA01000002608233'); 
 
       i := rec_coverage_new.first; 
       loop 
                  exit  when i is null; 
       dbms_output.put_line(i);          
       i := rec_coverage_new.next(i);        
       end loop;      
end; 

 

--方法二:
declare  
  i integer ; 
  rec_coverage_new gums_package_underwriting.salary_changed_tab;--table类型 
begin 
       rec_coverage_new := gums_package_underwriting.get_salary_changed_info('PA01000002608233'); 
       i := 0; 
       while i<rec_coverage_new.count loop 
           i :=i+1;                   --从1开始 
           dbms_output.put_line(i);   
       end loop;      
end; 
 

--方法三:
declare  
  i integer ; 
  rec_coverage_new gums_package_underwriting.salary_changed_tab;--table类型 
begin 
       rec_coverage_new := gums_package_underwriting.get_salary_changed_info('PA01000002608233'); 
       i := rec_coverage_new.first ; 
 
       while i<= rec_coverage_new.last loop 
           --从1开始 
           dbms_output.put_line(i);  
           --i :=i+1;   
           i := rec_coverage_new.next(i);   
       end loop;       
end;