使用oracle 儲存過程返回集合
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區別
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
http://blog.csdn.net/lee576/article/details/7207217