【Oracle-PLsql】使用存储过程,利用table集合类型开发复杂业务报表
在一般的项目中,都需要开发一些报表,少则几个字段,多则几十个字段,需要关联的表可能多达十几、几十张表,如果想要使用一个SQL语句将这几十张表关联起来
查询所需要的字段,当你听到这里的时候,你的脑子可能已经晕掉了,这得多麻烦啊,不光多麻烦,你甚至可能还写不出来,即使你写出来了,也肯定是bug一堆。等你过
接个月再来看看这段SQL,估计已经看不明白了。等到后人来维护你这段SQL的时候,他估计会咬牙切齿,恨不得要把这段代码的作者撕个粉碎。
那么接下来,就给大家介绍一个Oracle的功能,使用table集合类型返回结果集,顾名思义你就可以把它看成是一个表,本来结果集也可以看成是一张表嘛。话不多说,直接来看代码。
1.首先定义一个type,包括返回结果集所需要显示的字段。
- CREATE OR REPLACE TYPE query_rpt_test force is object
- (
- full_name varchar2(200),
- birth_date date,
- gender varchar2(200)
- )
2.接着定义table类型
- CREATE OR REPLACE TYPE t_query_rpt_test is table of query_rpt_test
3.然后定义package
- create or replace package PKG_REPORT_QUERY_TEST is
- --定义取数的function,传入参数分别是开始日期和截止日期
- function f_get_query_report(i_begin_date date, i_end_date date)
- --返回类型为t_query_rpt_test
- return t_query_rpt_test;
- end PKG_REPORT_QUERY_TEST;
4.定义package body
- create or replace package body PKG_REPORT_QUERY_TEST is
- --定义取数的function,传入参数分别是开始日期和截止日期
- function f_get_query_report(i_begin_date date, i_end_date date)
- return t_query_rpt_test as
- --返回类型为t_query_rpt_test
- m_table t_query_rpt_test;
- --结果集行数初始值
- m_row_num number := 0;
- --一些变量的定义
- n_list_id number;
- v_full_name varchar2(200);
- v_birthday date;
- v_gender varchar2(20);
- --游标的定义
- --这边的业务逻辑要看的该商品的购买者的姓名,生日和性别
- --此处举例比较简单,只有t_product和t_customer两张表的关联关系,完全可以两者表关联起来放在同一个cursor中,
- --这边先查询出在该区间段内的所有商品信息的主键List_id
- cursor c_product is
- select p.list_id
- from t_product p
- where p.buy_date >= i_begin_date
- and p.buy_date <= i_end_date;
- begin
- --结果集初始化
- m_table := t_query_rpt_test();
- --打开游标
- open c_product;
- loop
- --循环遍历游标内的每一个数据
- fetch c_product
- into n_list_id;
- exit when c_product%notfound;
- --以下就是每个字段的取数逻辑了,除此之外,整个package的function格式都是固定的。
- --根据遍历的数据n_list_id在t_customer中查询客户信息
- select c.full_name, c.birthday, c.gender
- into v_full_name, v_birthday, v_gender
- from t_customer c
- where c.product_id = n_list_id;
- --扩充结果集
- m_table.extend;
- --结果集行数自增1
- m_row_num := m_row_num + 1;
- --设置结果集中每个字段的值
- m_table(m_row_num) := query_rpt_test(v_full_name,
- v_birthday,
- v_gender);
- end loop;
- --循环结束,关闭游标
- close c_policy;
- --返回结果集
- return m_table;
- end f_get_query_report;
- end PKG_REPORT_QUERY_TEST;
好了,整个代码都编写完成了,那么我们如何来使用呢,直接编写如下语句就能返回一个结果集了。
- select * from table(PKG_REPORT_QUERY_TEST.f_get_query_report(to_date('2013-01-01','yyyy-MM-dd'),to_date('2013-01-01','yyyy-MM-dd')));
这样的话在Java中使用也非常方便,就不用再在java代码中写一大堆SQL了。
OK,总结一下,整个开发流程就是:
1.定义cursor。cursor的作用只需要查询最精简最有用的信息,至于其他,通通放到取数逻辑中去。
2.打开cursor,根据cursor中的值进行相应的取数逻辑。
3.结果集的扩充,自增1,然后设置结果集的值。
4.最后当然要有返回值:结果集。
很明显,优点就是:简单方便,便于维护,以后只需要在type类型中增加相应的字段,在package中增加相应的取数逻辑,最后设上值即可。
转自:http://blog.csdn.net/andn_pan/article/details/16946365
【Oracle-PLsql】使用存储过程,利用table集合类型开发复杂业务报表的更多相关文章
- Guava集合--新集合类型
Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...
- Oracle/PLSQL存储过程详解
原文链接:https://blog.csdn.net/zezezuiaiya/article/details/79557621 Oracle/PLSQL存储过程详解 2018-03-14 17:31: ...
- Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例
Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13| 分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...
- PKG_COLLECTION_LHR 存储过程或函数返回集合类型
存储过程或函数可以返回集合类型,方法很多,今天整理在一个包中,其它情况可照猫画虎. CREATE OR REPLACE PACKAGE PKG_COLLECTION_LHR AUTHID CURREN ...
- Oracle存储过程-自定义数据类型,集合,遍历取值
摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇 ...
- 浅谈Oracle函数返回Table集合
在调用Oracle函数时为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合 ...
- Oracle集合类型
Oracle集合类型介绍 集合类型 1. 使用条件: a. 单行单列的数据,使用标量变量 . b. 单行多列数据,使用记录 c. 单列多行数据,使用集合 *集 ...
- PLSQL集合类型
PLSQL集合类型 --联合数组(索引表) /* 用于存储某个数据类型的数据集合类型 .通过索引获得联合数组中得值 如下例子: */ DECLARE CURSOR cur_chars IS SEL ...
- PLSQL集合类型的使用总结
PLSQL集合类型的使用总结 在pl sql 中,集合(collection) 是一组有序的元素组成的对象,这些元素的类型必须一致. pl sql 将collection 分成3 类,分别为Assoc ...
随机推荐
- ADODB 手册
PHP ADODB1.99版手册 (修正版) PHP ADODB 1.99版手册中文翻译 <修正版> ADODB PHP 在数据库的支持上是很令人称道的,几乎所有的知名数据库系 ...
- mongodb.mongoose维护内嵌数组元素
运行环境: - Nodejs - MongoDB 文档实例名: ProjectJob 文档格式如下: { "_id" : ObjectId("5bc69eb0b298b3 ...
- Knockout.Js官网学习(enable绑定、disable绑定)
enable绑定 enable绑定使DOM元素只有在参数值为 true的时候才enabled.在form表单元素input,select,和textarea上非常有用. enable简单示例 < ...
- 290.单词模式。给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。(c++方法)
题目描述: 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之 ...
- 关于VC预定义常量_WIN32,WIN32,_WIN64(转)
VC2012 下写 Windows 程序时,有时需要判断编译环境.在之前的文章<判断程序是否运行在 Windows x64 系统下.>里说过如何在运行期间判断系统环境,但在编译时如何判断? ...
- 把tree结构数据转换easyui的columns
很多时候我们的datagrid需要动态的列显示,那么这个时候我们后台一般提供最直观的数据格式tree结构.那么需要我们前端自己根据这个tree结构转换成easyui的datagrid的columns. ...
- DockOne技术分享(二十):Docker三剑客之Swarm介绍
[编者的话]Swarm项目是Docker公司发布三剑客中的一员,用来提供容器集群服务,目的是更好的帮助用户管理多个Docker Engine,方便用户使用,像使用Docker Engine一样使用容器 ...
- syslog之三:建立Windows下面的syslog日志服务器
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
- C++ 重载运算符和重载函数
C++ 重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是 ...
- JAVA和JAVAC 命令行
转自:http://www.blogjava.net/pdw2009/archive/2008/06/12/207413.html?opt=admin javac和java命令行中的-classpat ...