返回表对象的方法之一--bulk collect into

1.创建表对象的类型(oracle Types类目录下)

create or replace type obj_table1 as object
(
xzq nvarchar2(19),
mj number(38,8),
gjzrd number(5),
gjlyd number(5),
gjjjd number(5)
)

2.创建虚拟表 (oracle Types类目录下)

create or replace type t_table1 is table of obj_table1

3.创建oracle函数

create or replace function GDZL_XJFDDY_FX(ksnd integer,jsnd integer)
return t_table1
is
v_test T_TABLE1 := T_TABLE1();
flag varchar2(50);
flag1 varchar2(50);
d integer:=ksnd-1;
cout varchar2(2000);
cout1 integer;
cmd varchar2(4000);
xxc varchar2(50);
xxl varchar2(50);
xxxl varchar2(50);
xxxxc varchar2(50);
cmd_sql varchar(4000);
begin
if ksnd is null or jsnd is null then
return v_test;
end if;
xxc:='XJFDDY33';
xxxxc:='XJLXFDDY33';

loop
<<here>>
d:=d+1;
if d>jsnd then
exit;
end if;
xxl:=xxc||d;
xxxl:=xxxxc||d;
cmd:='select count(1) from all_all_tables t where t.owner=''SDE'' and t.table_name='''||xxl||'''';
execute immediate cmd into cout;
cmd:='select count(1) from all_all_tables t where t.owner=''SDE'' and t.table_name='''||xxxl||'''';
execute immediate cmd into cout1;

if cout>0 and cout1>0 then
flag:='SDE.'||xxl||' t where 1=1';
flag1:='SDE.'||xxxl||' t where 1=1';
else
goto here;
end if;
cmd:='select xzq,mj,gjzrd,gjlyd,gjjjd from (select substr(t.dybh,1,6) as xzq,round(sum(nvl(t.tbdlmj,0))/10000,2) as mj,t.gjzrd,t.gjlyd,t.gjjjd
from '||flag||' group by t.dlmc,substr(t.dybh,1,6),t.gjzrd,t.gjlyd,t.gjjjd
union all
select substr(t.dybh,1,6) as xzq,round(sum(nvl(t.mj,0))/10000,2) as mj,t.gjzrd,t.gjlyd,t.gjjjd
from '||flag1||' group by substr(t.dybh,1,6),t.gjzrd,t.gjlyd,t.gjjjd )';
if cmd_sql is null then
cmd_sql:=cmd;
else
cmd_sql:=cmd||' union all '||cmd_sql;
end if;
end loop;
if cmd_sql is not null then
EXECUTE IMMEDIATE 'select OBJ_TABLE1(xzq,mj,gjzrd,gjlyd,gjjjd) from ('||cmd_sql||')' bulk collect into v_test;
end if;
return v_test ;
end GDZL_XJFDDY_FX;

猜你喜欢

转载自www.cnblogs.com/huodige/p/8967838.html