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.mzph.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…