oracle管道化表函数

在我所做过和参与的大多数项目中,都会有用户提出的复杂的一些统计报表之内的功能要求,根据统计的复杂程度、效率及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://blog.chinaunix.net/u1/57759/showart_458451.html

oracle 管道函数+动态游标 oracle 管道函数 动态游标,自定义类型,转table 立即下载

相关推荐

Keil 编译输出信息分析:Program size: Code, RO-data , RW-data, ZI-data

一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在 MCU 不同的存储区。如图所示,在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息。

qq_40305944的博客 4576

Oracle_应用管道函数时_pipelined

 Oracle 应用管道函数时 pipelined 出现PLS-00653:在PL/SQL 定义域内不允许有聚集/表函数网友说:在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REFCURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i 通过引入的管道化表函数纠正了后一种情况。表函...

winingblog 1408

R语言的下载、安装及环境配置(Rstudio&VSCode)

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。

zegeai的博客 2万+

ORACLE管道化表函数

        table型函数用来返回类似表结构的集合,常规的table型函数需要先填充完集合才能返回,如果集合对象太大会消耗大量内存;pipelined的table型函数能够在边填充时边返回,从而避免占用过多内存。 一.Table Functions -- Create the types to support the table function. DROP TYPE t_tf_t...

wjxbj的博客 206

西门子S7-1200与汇川SV660F伺服Profinet通讯调试实战

在工业自动化领域,Profinet作为工业以太网标准协议,凭借其高实时性和灵活组网能力,已成为伺服驱动器与PLC通讯的主流选择。其核心原理是通过设备名识别、IP分配以及标准报文(如111速度报文、105定位报文)传输控制字与状态字,实现驱动器的精准控制。相比传统脉冲或CANOpen方案,Profinet直连省去了协议转换网关,降低了成本与故障点,尤其适用于绕线设备、包装机械等中小型单轴或多轴运动控制系统。本文以西门子S7-1200 PLC搭配汇川SV660F伺服为例,完整梳理了从GSDMD组态、InoDri

weixin_29184371的博客 222

论文理解【LLM-Clarification】—— 【QDrawer】Asking the Right Question at the Right Time: Human and Model Unce

本文基于 CoDraw 任务对 LLM 澄清提问的触发方式进行探索,发现模型内部不确定性与人类澄清决策相关性弱,使用不确定性阈值触发澄清提问相比模仿人类提问时机,性能和计算效率都更好

佚失的诗篇 767

ORACLE 管道化表函数

表函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函数可以平行执行,并可持续输出数据流,被称作管道式输出。应用表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表。    1. 用游标传递数据利用游标 REF CURSOR 可将数据集(多行记录)传递到PL/SQL函数:SELECT *  FROM TABLE (myfunction (CURSOR (SELECT * 

FindingMySelf的专栏 1333

保姆级教程:用Docker快速部署mpromonet/webrtc-streamer实现WebRTC直播(附常见问题解决)

本文提供了一份详细的Docker部署mpromonet/webrtc-streamer的实战指南,帮助用户快速搭建WebRTC直播服务。内容涵盖从环境准备、基础部署到进阶配置与性能调优的全过程,并针对容器网络、视频流配置、跨网访问等常见问题提供了解决方案,旨在实现低延迟的流媒体传输。

dell8的博客 177

Oracle管道函数(Pipelined Table Function)介绍

一 概述: 1、管道函数即是可以返回行集合(可以使嵌套表nested table 或数组 varray)的函数,我们可以像查询物理表一样查询它或者将其 赋值给集合变量。 2、管道函数为并行执行,在普通的函数中使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端。如果需要在客户端 实时的输出函数执行过程中的一些信息,在oracle9i以后...

老徐的博客只有干货 3万+

香橙派5使用RK3588S内置NPU加速yolov5推理,实时识别数字达到50fps

香橙派5采用了RK3588S,内置的NPU达到了6Tops的算力,博主这里记录一下自己的踩坑过程,好不容易做出来的不能以后忘记了(手动狗头)。这里博主还在B站上发布了效果视频,大家感兴趣的话可以看一下。其中解决了先验框标注位置不对,或者出现非常多的框的问题

weixin_51651698的博客 2万+

Dell R730安装Windows Server 2008 R2

一、RAID驱动准备  在安装Windows server2008 R2操作系统时,如果没有发现硬盘,请将下面的阵列卡驱动先解压(在下载的.exe文件,双击点下一步会自动解压),解压后把那文件夹复制到U盘中。阵列卡 PERC9 H330 - H730 - H730P - H830 Controllers for Windows Server 2008 R2二、系统安装方法方法一:光盘安装  ①请您...

MarshLin 2万+

PLS-00653与管道化表函数的调用

Oracle 应用管道函数时出现PLS-00653:在 PL/SQL 定义域内不允许有聚集/表函数       创建一个表类型的 create or replace type str_list as table of varchar(300) ;   比如我们创建一个带pipelied 管道函数返回一张表或一个数据源数据的函数test5 create or replace functi

与数据和AI有关的东西 5577

YOLOv11 改进 - 注意力机制 | HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模

本文介绍了局部自注意力机制(HaloAttention)在YOLOv11中的结合应用。局部自注意力通过关注输入数据局部区域来捕捉特征关系,能降低计算复杂度、增强局部特征捕捉,且可与CNN结合。其计算时先定义局部窗口,再计算注意力权重并加权求和。我们将HaloAttention集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,改进后的模型在目标检测和实例分割等任务中表现更佳,证明了自注意力模型在传统卷积主导领域的有效性。

魔改工程师的博客 1139

oracle创建表函数关键,ORACLE 管道化表函数 例子

ORACLE 自定义函数,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REFCURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。但是这种集合类型,并不能直接作为FROM 的宾语。不过,自从 Oracle9i之后,提供了一个叫做"管道化表函数"的概念。来解决此类问题,这种类型的函数,必须返回一个集合类型,且标明PIPELINED。这个函数不...

weixin_31313019的博客 247

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Oracle 函数function返回table--管道化表函数

Oracle 函数function返回table–管道化表函数 1 、定义type行类型 CREATE OR REPLACE TYPE MESTK_ADMIN.LOTPARAM_TABLE_ROW FORCE as object ( PARAM_NAME varchar2(100), PARAM_VALUE varchar2(100), PARAM_TYPE varchar2(10) ); 2、定义table类型 CREATE OR REPLACE TYPE ME

Line834dch738ly的博客 1567

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ORACLE管道化表函数实例

        ORACLE 自定义函数,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。但是这种集合类型,并不能直接作为 FROM 的宾语。不过,自从 Oracle9i 之后,提供了一个叫做"管道化表函数"的概念。来解决此类问题,这种类型的函数,必须返回一个集合类型,且标明 P...

wjxbj的博客 330

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

oracle 管道化表函数(Pipelined Table) [转]

http://log-cd.javaeye.com/blog/411123关键字: oracle pipelined table 在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i 通过...

weixin_33735077的博客 105

oracle 管道化表函数(Pipelined Table)

在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函

cooperSun 1360

oracle 管道化表函数介绍

在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i...

181

Oracle 管道化表函数(Pipelined Table)

在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表...

wiseboyloves 200
上一篇: Struts2 OGNL遍历
下一篇: OutputStreamWriter类getEncoding方法的应用
javaRwx
博客等级 码龄20年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值