日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oracle 管道通信,oracle管道化表函数

發(fā)布時(shí)間:2023/12/9 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 管道通信,oracle管道化表函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:http://pengfeng.javaeye.com/blog/260360

在我所做過(guò)和參與的大多數(shù)項(xiàng)目中,都會(huì)有用戶提出的復(fù)雜的一些統(tǒng)計(jì)報(bào)表之內(nèi)的功能要求,根據(jù)統(tǒng)計(jì)的復(fù)雜程度、效率及JAVA程序調(diào)用的方便性方面考慮,主要總結(jié)出以下幾種方案: 1、SQL語(yǔ)句 該方案只能實(shí)現(xiàn)一些相對(duì)簡(jiǎn)單些的查詢統(tǒng)計(jì)功能,語(yǔ)句嵌套多、寫起來(lái)特別復(fù)雜,使程序的可讀性變差,下面是實(shí)現(xiàn)一個(gè)按照上級(jí)機(jī)關(guān)統(tǒng)計(jì)下級(jí)各個(gè)公安機(jī)關(guān)管轄范圍內(nèi)對(duì)應(yīng)的各個(gè)類別社會(huì)單位數(shù)量的統(tǒng)計(jì)功能的SQL: select rpad(gajg_dm,12,'0'), ? sum(decode(C01, 0, 0, C01)) as C01, ? sum(decode(C02, 0, 0, C02)) as C02, ? sum(decode(C03, 0, 0, C03)) as C03, ? sum(decode(C04, 0, 0, C04)) as C04, ? sum(decode(C05, 0, 0, C05)) as C05, ? sum(decode(C06, 0, 0, C06)) as C06, ? sum(decode(C07, 0, 0, C07)) as C07, ? sum(decode(C08, 0, 0, C08)) as C08, ? sum(decode(C09, 0, 0, C09)) as C09, ? sum(decode(C10, 0, 0, C10)) as C10, ? sum(decode(C11, 0, 0, C11)) as C11 ? from ? ( ??? select substr(b.gajg_dm,0,decode(substr(b.gajg_dm,0,8),'41000030',8,'41000006',8,'41000061',8,'41000060',8,4)) gajg_dm,/*b.gajg_dm,*/ cslb_dm, ????? sum(decode(cslb_dm, '01', 1, 0)) as C01, ????? sum(decode(cslb_dm, '02', 1, 0)) as C02, ????? sum(decode(cslb_dm, '03', 1, 0)) as C03, ????? sum(decode(cslb_dm, '04', 1, 0)) as C04, ????? sum(decode(cslb_dm, '05', 1, 0)) as C05, ????? sum(decode(cslb_dm, '06', 1, 0)) as C06, ????? sum(decode(cslb_dm, '07', 1, 0)) as C07, ????? sum(decode(cslb_dm, '08', 1, 0)) as C08, ????? sum(decode(cslb_dm, '09', 1, 0)) as C09, ????? sum(decode(cslb_dm, '10', 1, 0)) as C10, ????? sum(decode(cslb_dm, '11', 1, 0)) as C11 ????? from yf_cs_jbxx a, dm_gajg b where b.gajg_dm=a.gajg_dm(+) and b.gajg_dm like '41%' --and b.gajg_pcs_bz<>'N' ???? --group by substr(b.gajg_dm,0,4), cslb_dm ???? group by substr(b.gajg_dm,0,decode(substr(b.gajg_dm,0,8),'41000030',8,'41000006',8,'41000061',8,'41000060',8,4)),cslb_dm ?? ) t group by rpad(gajg_dm,12,'0')--gajg_dm ?? 在該SQL語(yǔ)句中,主要有三個(gè)步驟: 1)統(tǒng)計(jì)各個(gè)機(jī)關(guān)下各個(gè)類別的單位數(shù)量 2)對(duì)編碼不規(guī)則機(jī)關(guān)進(jìn)行decode和截位處理 3)對(duì)1中的統(tǒng)計(jì)結(jié)果進(jìn)行行列轉(zhuǎn)換 夠復(fù)雜了吧,而且還很別扭,看著就暈。。。。更別說(shuō)代碼數(shù)據(jù)再發(fā)生點(diǎn)變化了 ? 2、存儲(chǔ)過(guò)程返回游標(biāo) 對(duì)于該方案是被我們直接PASS掉的一種方案,主要考慮其性能太差,這里就不再啰嗦了 ? 3、臨時(shí)表(或中間表) 對(duì)于該方案主要分為兩步完成統(tǒng)計(jì): 1)通過(guò)存儲(chǔ)過(guò)程或函數(shù)完成對(duì)數(shù)據(jù)的統(tǒng)計(jì) 2)將統(tǒng)計(jì)結(jié)果插入到臨時(shí)表中 這樣程序在執(zhí)行統(tǒng)計(jì)時(shí)就要求先調(diào)用執(zhí)行統(tǒng)計(jì)的存儲(chǔ)過(guò)程,然后再查詢臨時(shí)表以取出存儲(chǔ)過(guò)程產(chǎn)生的統(tǒng)計(jì)結(jié)果 ? 呵呵,每個(gè)統(tǒng)計(jì)還要對(duì)應(yīng)建一個(gè)臨時(shí)表,看著就閑麻煩。。。 ? 4、管道表函數(shù) 管道化表函數(shù)是我見(jiàn)過(guò)的最佳的實(shí)現(xiàn)統(tǒng)計(jì)的解決方案(當(dāng)然是在我做的項(xiàng)目中,具體東西具體環(huán)境具體應(yīng)用嗎),這里給出兩個(gè)實(shí)例和說(shuō)明,供大家參考,但該方案同樣有一個(gè)缺點(diǎn),就是在PLSQL下調(diào)試極其不方面,但基本還能忍受 CREATE OR REPLACE PACKAGE pkg1 AS ? -- Purpose : 對(duì)表函數(shù)的應(yīng)用實(shí)例 ? TYPE ty_rec_user IS record (--定義一個(gè)record類型的TYPE ?????? id number(20), ?????? name varchar2(60) ? ); ? TYPE out_rec_set is table of ty_rec_user;--定義一個(gè)嵌套表集合類型out_rec_set,作為表函數(shù)的返回類型 ? --定義返回集合類型的管道表函數(shù) ? FUNCTION f1(x NUMBER) RETURN out_rec_set PIPELINED; ? ? --引用在外部自定義的object類型作為表函數(shù)的集合類型 ? TYPE out_obj_set is table of TY_OBJ_USER; ? FUNCTION F_PIE_TEST(c NUMBER) RETURN out_obj_set PIPELINED; END pkg1; CREATE OR REPLACE PACKAGE BODY pkg1 AS ? -- Purpose : 對(duì)表函數(shù)的應(yīng)用實(shí)例 FUNCTION f1(x NUMBER) RETURN out_rec_set PIPELINED IS ? user_rec ty_rec_user; ? BEGIN ??? FOR i IN 1..x LOOP ????? --user_rec:=ty_rec_user(i,'user'||i);--ty_rec_user定義為record類型時(shí)不能這樣賦值,只有定義成obj時(shí)才可以 ????? user_rec.id:=i; ????? user_rec.name:='user'||i; ????? --PIPE ROW(1, 'user'||1); ????? pipe row(user_rec); ??? END LOOP; ??? RETURN; ? END; --使用在外部自定義的object類型表函數(shù) FUNCTION F_PIE_TEST(c NUMBER) RETURN out_obj_set PIPELINED is ? user_ty_obj TY_OBJ_USER; ? BEGIN ???? FOR i in 1..c LOOP ???????? user_ty_obj:=TY_OBJ_USER(i,'name'||i); ???????? PIPE ROW(user_ty_obj); ???? END LOOP; ???? RETURN; ? END; END pkg1; --外部自定義的object類型 create or replace type TY_OBJ_USER as object ( ? -- Purpose : 測(cè)試 ? id number(20), ? name varchar2(60), ) 表函數(shù)的調(diào)用: select * from table(pkg1.f1(4))--直接在plsql中執(zhí)行 select * FROM TABLE(CAST(pkg1.f1(4) AS out_rec_set))--java端程序調(diào)用 ?看到這相信很多人已經(jīng)開始感覺(jué)到爽了吧~~,特別是數(shù)據(jù)開發(fā)人員,不用再在數(shù)據(jù)端實(shí)現(xiàn)統(tǒng)計(jì)后還要給應(yīng)用程序開發(fā)人員講半天如何調(diào)用了,應(yīng)用程序開發(fā)人員在調(diào)用復(fù)雜的統(tǒng)計(jì)時(shí)一個(gè)select語(yǔ)句就搞定,不用考慮什么游標(biāo)啊、臨時(shí)表這些亂七八糟的東西了,直接一個(gè)select就出來(lái)結(jié)果,和查詢一個(gè)表一樣的簡(jiǎn)單

總結(jié)

以上是生活随笔為你收集整理的oracle 管道通信,oracle管道化表函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。