pipelined函式例項

hxl發表於2009-03-23
PIPELINED函式例項

[@more@]

最近使用者提供一份如下格式資料的EXCEL
地市公司 學校名稱 學生數
AA公司 巴馬一小 0
AA公司 NULL 0
AA公司 NULL 0
AA公司 NULL 0
AA公司 NULL 0
AA公司 NULL 500
BB公司 巴馬二小 0
BB公司 NULL 0
BB公司 NULL 0
BB公司 NULL 0
BB公司 NULL 0
BB公司 NULL 255
. . .
. . .
. . .
最後需要實現的效果如下:
地市公司 學校名稱 學生數
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 500
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 255
. . .
. . .
. . .
EXCEL有上萬筆記錄,手工處理可以實現,但需要花費長時間,
試著使用ORACLE中的pipelined函式實現,pipelined函式需要返回的是集合資料型別
所以事先我們需要建立集合.
建立物件型別
SQL> create or replace type xiaox_type as object
(
area_code varchar2(100)
,school_name varchar2(100)
,sf_number number
);
/

型別已經建立。

建立集合
SQL> create or replace type xiaox_type_test as table of xiaox_type
2 /

型別已建立。


SQL>create or replace function fn_pipeline_test
return xiaox_type_test
pipelined
is
v_xiaox_type xiaox_type:=xiaox_type(null,null,null); -- 初始化集合
v_sch_name varchar2(100);
v_sch_name_tmp varchar2(100):=null;
v_area_code varchar2(100);
v_sf number;
cursor fetch_data is select
area_code
,school_name
,sf_number
from hw_hxl.tp_hxl_xiaox_200812_cp_tmp
;
begin
open fetch_data;
fetch fetch_data into v_area_code,v_sch_name,v_sf;
while fetch_data%found loop

if v_sch_name is not null then
v_sch_name_tmp:= v_sch_name;
begin
v_xiaox_type.area_code:= v_area_code;
v_xiaox_type.school_name := v_sch_name;
v_xiaox_type.sf_number := v_sf;
end;
else
v_xiaox_type.area_code:= v_area_code;
v_xiaox_type.school_name := v_sch_name_tmp;
v_xiaox_type.sf_number := v_sf;
end if;
pipe row(v_xiaox_type);
fetch fetch_data into v_area_code,v_sch_name,v_sf;
end loop;
commit;
close fetch_data;
end
;
/
函式已建立.

呼叫fn_pipeline_test函式
select * from table(fn_pipeline_test);
得到如下輸出效果:
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 500
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 255
. . .
. . .
. . .

注:針對以上使用者提供的資料還可以使用AWK處理:
將使用者提供過來的EXCEL檔案另存為null.txt,
處理後的資料儲存為null_deal.txt
awk -F't' 'BEGIN{OLD_SCHOOL="";}
{
if(length($2)>0) {
OLD_SCHOOL=$2;
}
printf"%st%st%sn", $1, OLD_SCHOOL, $3;
}' null.txt>null_deal.txt

test$head -12 null_deal.txt
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 0
AA公司 巴馬一小 500
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 0
BB公司 巴馬二小 255

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/77311/viewspace-1019329/,如需轉載,請註明出處,否則將追究法律責任。

相關文章