1 所谓返回集合是返回游标
集合可以不使用临时表,使用oracle自定义类型
2 可以先建一个object的type,再建一个type 类型为table
如:CREATE OR REPLACE TYPE Dis_WGM_dayreport_type as object(
queryday date, --查询的某天
reporttype VARCHAR2(20), -
station VARCHAR2(32),
stationcode VARCHAR2(120),
......
)
CREATE OR REPLACE TYPE Dis_WGM_dayreport_records AS TABLE OF Dis_WGM_dayreport_type
3 在存储过程中定义
v_record Dis_WGM_dayreport_type;
v_temp Dis_WGM_dayreport_records:=Dis_WGM_dayreport_records();
4 然后在存储过程中对其进行赋值
----v_tempYear_szm_fy为record type的集合
vN := v_tempYear_szm_fy.First;
For varR In vN .. v_tempYear_szm_fy.count Loop
v_record := Dis_WGM_dayreport_type(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null);
v_record.meizhong := v_tempYear_szm_fy(vN).meizhong;
v_temp.Extend;
v_temp(vN) := v_record;
DBMS_OUTPUT.PUT_LINE(vN || ' ' || v_tempYear_szm_fy(vN).meizhong ||
' ' || v_tempYear_szm_fy(vN).ls || ' ' || v_tempYear_szm_fy(vN).ds);
vN := v_tempYear_szm_fy.Next(vN);
End Loop;
5 最后返回
Open retcur For
select * from table(v_temp);
6 存储过程定义为
create or replace package PKG_DIS_WGM as
procedure GETDAYREPROT(P_QUERYDAY in date, retcur out Sys_refcursor);
--获取日报表
Type DIS_WGM_Q_INFO Is record(
station VARCHAR2(32),
meizhong VARCHAR2(32),
ls NUMBER(5, 0),
ds NUMBER(12, 2)
);
Type DIS_WGM_Q_INFO_RECORD IS TABLE OF DIS_WGM_Q_INFO INDEX BY BINARY_INTEGER;
end PKG_DIS_WGM;
7 as和is区别,record和object区别
可以参考 oracle 自定义类型 type / create type
8其他知识
-- 批量给Dis_WGM_dayreport_records插入数据
Select Dis_WGM_dayreport_type(.....)
Bulk collect into v_temp
From T_Test
在定义record集合的时候
Type DIS_WGM_Q_INFO_RECORD IS TABLE OF DIS_WGM_Q_INFO INDEX BY BINARY_INTEGER;
红色字体表示增加记录时,不必每次都做 Extend操作了
参考
http://www.cnblogs.com/advocate/p/3729998.html
oracle 自定义类型 type / create type
http://blog.youkuaiyun.com/lee576/article/details/7207217