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

轉自:http://pengfeng.javaeye.com/blog/260360

在我所做過和參與的大多數項目中,都會有用戶提出的復雜的一些統計報表之內的功能要求,根據統計的復雜程度、效率及JAVA程序調用的方便性方面考慮,主要總結出以下幾種方案: 1、SQL語句 該方案只能實現一些相對簡單些的查詢統計功能,語句嵌套多、寫起來特別復雜,使程序的可讀性變差,下面是實現一個按照上級機關統計下級各個公安機關管轄范圍內對應的各個類別社會單位數量的統計功能的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語句中,主要有三個步驟: 1)統計各個機關下各個類別的單位數量 2)對編碼不規則機關進行decode和截位處理 3)對1中的統計結果進行行列轉換 夠復雜了吧,而且還很別扭,看著就暈。。。。更別說代碼數據再發生點變化了 ? 2、存儲過程返回游標 對于該方案是被我們直接PASS掉的一種方案,主要考慮其性能太差,這里就不再啰嗦了 ? 3、臨時表(或中間表) 對于該方案主要分為兩步完成統計: 1)通過存儲過程或函數完成對數據的統計 2)將統計結果插入到臨時表中 這樣程序在執行統計時就要求先調用執行統計的存儲過程,然后再查詢臨時表以取出存儲過程產生的統計結果 ? 呵呵,每個統計還要對應建一個臨時表,看著就閑麻煩。。。 ? 4、管道表函數 管道化表函數是我見過的最佳的實現統計的解決方案(當然是在我做的項目中,具體東西具體環境具體應用嗎),這里給出兩個實例和說明,供大家參考,但該方案同樣有一個缺點,就是在PLSQL下調試極其不方面,但基本還能忍受 CREATE OR REPLACE PACKAGE pkg1 AS ? -- Purpose : 對表函數的應用實例 ? TYPE ty_rec_user IS record (--定義一個record類型的TYPE ?????? id number(20), ?????? name varchar2(60) ? ); ? TYPE out_rec_set is table of ty_rec_user;--定義一個嵌套表集合類型out_rec_set,作為表函數的返回類型 ? --定義返回集合類型的管道表函數 ? FUNCTION f1(x NUMBER) RETURN out_rec_set PIPELINED; ? ? --引用在外部自定義的object類型作為表函數的集合類型 ? 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 : 對表函數的應用實例 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類型時不能這樣賦值,只有定義成obj時才可以 ????? user_rec.id:=i; ????? user_rec.name:='user'||i; ????? --PIPE ROW(1, 'user'||1); ????? pipe row(user_rec); ??? END LOOP; ??? RETURN; ? END; --使用在外部自定義的object類型表函數 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 : 測試 ? id number(20), ? name varchar2(60), ) 表函數的調用: select * from table(pkg1.f1(4))--直接在plsql中執行 select * FROM TABLE(CAST(pkg1.f1(4) AS out_rec_set))--java端程序調用 ?看到這相信很多人已經開始感覺到爽了吧~~,特別是數據開發人員,不用再在數據端實現統計后還要給應用程序開發人員講半天如何調用了,應用程序開發人員在調用復雜的統計時一個select語句就搞定,不用考慮什么游標啊、臨時表這些亂七八糟的東西了,直接一個select就出來結果,和查詢一個表一樣的簡單

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ebtables之BROUTING和PREROUTING的redirect的區別

ebtables和iptables實用工具都使用了Netfilter框架&#xff0c;這是它們一致的一方面&#xff0c;然而對于這兩者還真有一些需要聯動的地方。很多人不明白ebtales的broute表的redirect和nat表PREROUTING的redirect的區別&#xff0c;其實只要記住兩點即可&#xff0c;那就是對于…

LVS的四種模式的實現

LVS 是四層負載均衡&#xff0c;也就是說建立在 OSI 模型的第四層——傳輸層之上&#xff0c;傳輸層上有我們熟悉的 TCP/UDP&#xff0c;LVS 支持 TCP/UDP 的負載均衡。LVS 的轉發主要通過修改 IP 地址&#xff08;NAT 模式&#xff0c;分為源地址修改 SNAT 和目標地址修改 DNA…

MyISAM與InnoDB兩者之間區別與選擇,詳細總結,性能對比

1、MyISAM&#xff1a;默認表類型&#xff0c;它是基于傳統的ISAM類型&#xff0c;ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫&#xff0c;它是存儲記錄和文件的標準方法。不是事務安全的&#xff0c;而且不支持外鍵&#xff0c;如果執行大量的sel…

leetcode557. 反轉字符串中的單詞 III

給定一個字符串&#xff0c;你需要反轉字符串中每個單詞的字符順序&#xff0c;同時仍保留空格和單詞的初始順序。 示例&#xff1a; 輸入&#xff1a;“Let’s take LeetCode contest” 輸出&#xff1a;“s’teL ekat edoCteeL tsetnoc” 代碼 class Solution {public St…

linux命令數據盤分多個區,pvmove命令 – 移動物理盤區

pvmove命令的作用是可以將源物理卷上的物理盤區移動到一個或多個其他的目標物理卷。使用pvmove命令時可以指定一個源日志或卷。在這種情況下&#xff0c;只有邏輯卷使用的區才會被移動到目標物理卷上的空閑或指定的區。如果沒有指定的物理卷&#xff0c;則使用卷組的默認規則分…

spanning-tree extend system-id

spanning-tree extend system-id 在交換機上啟用extended-system ID 特征使其支持 1024 MAC 地址, 在全局模式下使用 spanning-tree extend system-id命令.禁用時前面加 no。 spanning-tree extend system-id no spanning-tree extend system-id 命令用法 在不提供 1024 MAC 地…

leetcode841. 鑰匙和房間(bfs)

有 N 個房間&#xff0c;開始時你位于 0 號房間。每個房間有不同的號碼&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;…&#xff0c;N-1&#xff0c;并且房間里可能有一些鑰匙能使你進入下一個房間。 在形式上&#xff0c;對于每個房間 i 都有一個鑰匙列表 rooms[i]&a…

Codeforces 235C Cyclical Quest (后綴自動機)

題目鏈接: https://codeforces.com/contest/235/problem/C 題解: 對大串建后綴自動機 對詢問串復制拆環。這里一定要注意是復制一個循環節不是復制整個串&#xff01;循環節是要整除的那種 然后要做的實際上是在大串上跑&#xff0c;每經過一個點求出當前的最長公共子串&#x…

泛型型協變逆變_Java泛型類型簡介:協變和逆變

泛型型協變逆變by Fabian Terh由Fabian Terh Java泛型類型簡介&#xff1a;協變和逆變 (An introduction to generic types in Java: covariance and contravariance) 種類 (Types) Java is a statically typed language, which means you must first declare a variable and …

安卓系統換成linux系統軟件,將舊安卓手機打造成“簡易linux”機器,并部署AdGuardHome...

從原教程的安裝Linux Deploy 完成后&#xff0c;在配置 Linux下載鏡像的一些東西時有些許出入。首先&#xff0c;我是用的下載源地址是 http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports 清華的源挺好用的。 其他有出入的配置如圖(記得把源地址改清華的&#xff0c;華中科大…

let與expr命令的用法與實戰案例

let命令的用法 格式&#xff1a; let 賦值表達式 【注】let賦值表達式功能等同于&#xff1a;&#xff08;賦值表達式&#xff09; 例子&#xff1a;給自變量i加8 12345678[rootXCN ~]# i2 [rootXCN ~]# let ii8 [rootXCN ~]# echo $i 10[rootXCN ~]# ii8 #去掉let定義 [root…

在使用ToolBar + AppBarLayout,實現上劃隱藏Toolbar功能,遇到了一個坑。

問題&#xff1a;Android5.0以下版本Toolbar不顯示沉浸式狀態欄&#xff0c;沒有這個問題&#xff0c;但是5.0以上版本&#xff0c;就出現了莫名其妙的陰影問題&#xff0c;很是頭疼。 分享一下我的解決方案&#xff1a; 在AppBarLayout中加一個屬性&#xff1a; app:elevation…

leetcode1476. 子矩形查詢

請你實現一個類 SubrectangleQueries &#xff0c;它的構造函數的參數是一個 rows x cols 的矩形&#xff08;這里用整數矩陣表示&#xff09;&#xff0c;并支持以下兩種操作&#xff1a; updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) 用 new…

msbuild構建步驟_如何按照以下步驟構建最終的AI聊天機器人

msbuild構建步驟by Paul Pinard保羅皮納德(Paul Pinard) 如何按照以下步驟構建最終的AI聊天機器人 (How to build the ultimate AI chatbot by following these steps) 快速指南&#xff0c;可幫助您避免常見的陷阱 (A quick guide that helps you avoid common pitfalls) Bui…

第一章:最小可行區塊鏈

概覽區塊數據結構區塊哈希創世塊創建區塊保存區塊鏈驗證區塊完整性選擇最長鏈節點間通信操作節點架構運行測試小結概覽 區塊鏈的基礎概念非常簡單, 說白了就是一個維護著一個持續增長的有序數據記錄列表的這么一個分布式數據庫。在此章節中我們將實現一個簡單的玩具版的區塊鏈。…

Oracle Controlfile控制文件中記錄的信息片段sections

初學Oracle的朋友肯定對Controlfile控制文件中到底記錄了何種的信息記錄而感到好奇&#xff0c;實際上我們可以通過一個視圖v$controlfile_record_section來了解控制文件的信息片段&#xff1a; SQL> select type, record_size, records_total from v$controlfile_record_s…

linux 怎么禁止遍歷目錄,linux下遍歷目錄功能實現

/*編譯:dir:dir.cgcc -o $ $<*/#include #include #include #include #include int do_search_dir(char *path);int do_check_dir(char *fullpath, char* truefullpath);void usage(char *apps);int count 0;intmain(int argc,char **argv){char fullpath[…

leetcode面試題 16.26. 計算器(棧)

給定一個包含正整數、加()、減(-)、乘(*)、除(/)的算數表達式(括號除外)&#xff0c;計算其結果。 表達式僅包含非負整數&#xff0c;&#xff0c; - &#xff0c;*&#xff0c;/ 四種運算符和空格 。 整數除法僅保留整數部分。 示例 1: 輸入: “32*2” 輸出: 7 代碼 clas…

團隊項目電梯會議視頻

http://v.youku.com/v_show/id_XMjcyMjI3Mjk2NA.html?spma2hzp.8244740.userfeed.5!2~5~5~5!3~5~A轉載于:https://www.cnblogs.com/jingxiaopu/p/6749776.html

arduino服務器_如何使用Arduino檢查Web服務器的響應狀態

arduino服務器by Harshita Arora通過Harshita Arora 如何使用Arduino檢查Web服務器的響應狀態 (How to use Arduino to check your web server’s response status) Last year, I created Crypto Price Tracker (an app which was acquired by Redwood City Ventures this yea…