在一般的项目中,都需要开发一些报表,少则几个字段,多则几十个字段,需要关联的表可能多达十几、几十张表,如果想要使用一个SQL语句将这几十张表关联起来

查询所需要的字段,当你听到这里的时候,你的脑子可能已经晕掉了,这得多麻烦啊,不光多麻烦,你甚至可能还写不出来,即使你写出来了,也肯定是bug一堆。等你过

接个月再来看看这段SQL,估计已经看不明白了。等到后人来维护你这段SQL的时候,他估计会咬牙切齿,恨不得要把这段代码的作者撕个粉碎。

那么接下来,就给大家介绍一个Oracle的功能,使用table集合类型返回结果集,顾名思义你就可以把它看成是一个表,本来结果集也可以看成是一张表嘛。话不多说,直接来看代码。

1.首先定义一个type,包括返回结果集所需要显示的字段。

  1. CREATE OR REPLACE TYPE query_rpt_test force is object
  2. (
  3. full_name varchar2(200),
  4. birth_date date,
  5. gender  varchar2(200)
  6. )

2.接着定义table类型

  1. CREATE OR REPLACE TYPE t_query_rpt_test is table of query_rpt_test

3.然后定义package

  1. create or replace package PKG_REPORT_QUERY_TEST is
  2. --定义取数的function,传入参数分别是开始日期和截止日期
  3. function f_get_query_report(i_begin_date date, i_end_date date)
  4. --返回类型为t_query_rpt_test
  5. return t_query_rpt_test;
  6. end PKG_REPORT_QUERY_TEST;

4.定义package body

  1. create or replace package body PKG_REPORT_QUERY_TEST is
  2. --定义取数的function,传入参数分别是开始日期和截止日期
  3. function f_get_query_report(i_begin_date date, i_end_date date)
  4. return t_query_rpt_test as
  5. --返回类型为t_query_rpt_test
  6. m_table t_query_rpt_test;
  7. --结果集行数初始值
  8. m_row_num number := 0;
  9. --一些变量的定义
  10. n_list_id   number;
  11. v_full_name varchar2(200);
  12. v_birthday  date;
  13. v_gender    varchar2(20);
  14. --游标的定义
  15. --这边的业务逻辑要看的该商品的购买者的姓名,生日和性别
  16. --此处举例比较简单,只有t_product和t_customer两张表的关联关系,完全可以两者表关联起来放在同一个cursor中,
  17. --这边先查询出在该区间段内的所有商品信息的主键List_id
  18. cursor c_product is
  19. select p.list_id
  20. from t_product p
  21. where p.buy_date >= i_begin_date
  22. and p.buy_date <= i_end_date;
  23. begin
  24. --结果集初始化
  25. m_table := t_query_rpt_test();
  26. --打开游标
  27. open c_product;
  28. loop
  29. --循环遍历游标内的每一个数据
  30. fetch c_product
  31. into n_list_id;
  32. exit when c_product%notfound;
  33. --以下就是每个字段的取数逻辑了,除此之外,整个package的function格式都是固定的。
  34. --根据遍历的数据n_list_id在t_customer中查询客户信息
  35. select c.full_name, c.birthday, c.gender
  36. into v_full_name, v_birthday, v_gender
  37. from t_customer c
  38. where c.product_id = n_list_id;
  39. --扩充结果集
  40. m_table.extend;
  41. --结果集行数自增1
  42. m_row_num := m_row_num + 1;
  43. --设置结果集中每个字段的值
  44. m_table(m_row_num) := query_rpt_test(v_full_name,
  45. v_birthday,
  46. v_gender);
  47. end loop;
  48. --循环结束,关闭游标
  49. close c_policy;
  50. --返回结果集
  51. return m_table;
  52. end f_get_query_report;
  53. end PKG_REPORT_QUERY_TEST;

好了,整个代码都编写完成了,那么我们如何来使用呢,直接编写如下语句就能返回一个结果集了。

  1. 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集合类型开发复杂业务报表的更多相关文章

  1. Guava集合--新集合类型

    Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...

  2. Oracle/PLSQL存储过程详解

    原文链接:https://blog.csdn.net/zezezuiaiya/article/details/79557621 Oracle/PLSQL存储过程详解 2018-03-14 17:31: ...

  3. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  4. PKG_COLLECTION_LHR 存储过程或函数返回集合类型

    存储过程或函数可以返回集合类型,方法很多,今天整理在一个包中,其它情况可照猫画虎. CREATE OR REPLACE PACKAGE PKG_COLLECTION_LHR AUTHID CURREN ...

  5. Oracle存储过程-自定义数据类型,集合,遍历取值

    摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇 ...

  6. 浅谈Oracle函数返回Table集合

    在调用Oracle函数时为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合 ...

  7. Oracle集合类型

    Oracle集合类型介绍   集合类型   1. 使用条件:    a. 单行单列的数据,使用标量变量 .     b. 单行多列数据,使用记录    c. 单列多行数据,使用集合        *集 ...

  8. PLSQL集合类型

    PLSQL集合类型   --联合数组(索引表) /* 用于存储某个数据类型的数据集合类型 .通过索引获得联合数组中得值 如下例子: */ DECLARE CURSOR cur_chars IS SEL ...

  9. PLSQL集合类型的使用总结

    PLSQL集合类型的使用总结 在pl sql 中,集合(collection) 是一组有序的元素组成的对象,这些元素的类型必须一致. pl sql 将collection 分成3 类,分别为Assoc ...

随机推荐

  1. java运行时could not open ........jvm.cfg问题的解决

    我相信这个问题肯定让不少人头疼.小编也纠结了将近3个小时的时间,终于弄明白这是怎么回事并且解决 java都知道时运行命令,不能打开...jvm.cfg很明显是jre虚拟机出现了问题(要么时jre的路径 ...

  2. redis 在 php 中的应用(Server[ 服务器] 篇)

    本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: Server(服务器) BGREWRITEAOF BGSA ...

  3. CentOS禁止packagekit离线更新服务的办法

    以CentOs7为例,以root身份登录系统,然后执行以下命令: [root@localhost ~]# systemctl disable packagekit-offline-update.ser ...

  4. OEMbutton乱码问题解决

    一.出现故障: 在Linux环境中安装tid=12">Oracle 10g,启用EM时.出现button显示乱码现象,例如以下: 二.分析问题: 由于在安装Oracle10g时,JDK ...

  5. 动态ip、静态ip、pppoe拨号的区别

    pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网.宽带拨号上网.指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网.还有大街上的WIFI热点也很多,如 ...

  6. Error-MVCr:找到了多个与 URL 匹配的控制器类型。如果多个控制器上的特性路由与请求的 URL 匹配,则可能会发生这种情况。

    ylbtech-Error-MVCr:找到了多个与 URL 匹配的控制器类型.如果多个控制器上的特性路由与请求的 URL 匹配,则可能会发生这种情况. 1.返回顶部 1. 找到了多个与 URL 匹配的 ...

  7. CSS全局居中

    可见区域 垂直居中 top:$(document).scrollTop() + ($(document).height() - $(document).scrollTop())/2,

  8. Android性能优化-线程性能优化

    原文链接:Better Performance through Threading 线程的性能 熟练使用Android上的线程可以帮助你提高应用程序的性能. 本篇文章讨论了使用线程的几个方面:使用UI ...

  9. 常用CTPN、CRNN文本检测识别框架

    一.SWT识别: yestinsong/Text-Detection( Text Detection System with MSER , SWT and Text Verification(fft ...

  10. eclipse:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    JavaWeb: 报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Bui ...