`
blueskylan
  • 浏览: 98037 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

存储过程-根据类型合并相邻的票据

    博客分类:
  • db2
阅读更多

--drop table test;

-- 保存缓存数据的表
create table test (
  ftype varchar(32) ,
  fstart_serial integer ,
  fstart_code varchar(18) ,
  fend_serial integer ,
  fend_code varchar(18)
)

-- 测试数据
select * from table( values('1001', 3, '001', 1), ('1001', 3, '002', 2), ('1001', 3, '010', 10), ('1001', 3, '011', 11),
        ('1002', 5, '00001', 1), ('1002', 5, '00002', 2), ('1002', 5, '00010', 10), ('1002', 5, '00011', 11)

) as t(ftype, flen, fcode, fserial)
order by ftype, fserial


-- 创建一个临时表用来保存计算后的数据
DECLARE  GLOBAL TEMPORARY TABLE session.test (
  ftype varchar(32) ,
  flen integer ,
  fstart_serial integer ,
  fstart_code varchar(18) ,
  fend_serial integer ,
  fend_code varchar(18)
)
NOT LOGGED WITH REPLACE;

-- 删除存储过程
--drop PROCEDURE PROC_TEST;

-- 创建存储过程
-- 根据类型合并相邻的票据:先将合并后的票据保存到临时表然后再保存
CREATE PROCEDURE PROC_TEST (
  IN "PARA_ISSAVE" INTEGER, -- 是否保存数据
  IN "PARA_ISREFRESH" INTEGER -- 是否刷新数据
)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
EXTERNAL ACTION
OLD SAVEPOINT LEVEL
MODIFIES SQL DATA
INHERIT SPECIAL REGISTERS
 
proc_test_:
 
BEGIN  NOT ATOMIC

-- 保存查询数据的变量
DECLARE type_ varchar(32);
DECLARE len_ integer;
DECLARE serial_ integer;
DECLARE code_ varchar(18);

-- 保存合并后的数据变量 
DECLARE endType varchar(32);
DECLARE startSerial integer;
DECLARE startCode varchar(18);
DECLARE endSerial integer;
DECLARE endCode varchar(18);

-- 缓存表的记录数
declare count integer;

-- 执行sql是否出错的标记
declare sqlcode INT DEFAULT 0;

-- 0 取缓存(查询缓存表的数据)
DECLARE c_ret0 CURSOR with return FOR select ftype, fstart_serial, fstart_code, fend_serial, fend_code from test;

-- 1 刷新查询
DECLARE c_ret1 CURSOR with return FOR select ftype, fstart_serial, fstart_code, fend_serial, fend_code from session.test ;

--获取原始数据
DECLARE c_test CURSOR  FOR
select ftype, flen, fcode, fserial from table( values('1001', 3, '001', 1), ('1001', 3, '002', 2), ('1001', 3, '010', 10), ('1001', 3, '011', 11),
              ('1002', 5, '00001', 1), ('1002', 5, '00002', 2), ('1002', 5, '00010', 10), ('1002', 5, '00011', 11)

) as t(ftype, flen, fcode, fserial)
order by ftype,fserial;

-- 创建一个临时表用来保存计算后的数据
DECLARE  GLOBAL TEMPORARY TABLE session.test (
  ftype varchar(32) ,
  flen integer ,
  fstart_serial integer ,
  fstart_code varchar(18) ,
  fend_serial integer ,
  fend_code varchar(18)
)
NOT LOGGED WITH REPLACE;

if PARA_ISREFRESH = 0 then -- 不刷新时还要判断是否有缓存数据
  select count(*) into count from test;
end if;

if PARA_ISREFRESH = 1 or count = 0 then -- 如果需要刷新数据或者没有缓存数据

  open c_test ;

  FETCH c_test INTO type_, len_, code_, serial_ ;
 
  --------根据类型合并编号-------------------------------------------------------
  if sqlcode = 0 then
    set startSerial = serial_;
    set endSerial = serial_ - 1;
    set endType = type_;
    WHILE sqlcode = 0 DO
      if endType <> type_ or endSerial + 1 <> serial_ then -- 类型不相同或者号码不连续
    insert into session.test (ftype, flen, fstart_serial, fend_serial) values (endType, len_, startSerial, endSerial);
set startSerial = serial_;
  end if;
 
  set endSerial = serial_;
  set endType = type_;
  FETCH c_test INTO type_, len_, code_, serial_ ;
    END WHILE ;

    CLOSE c_test;

--保存最后一条记录
insert into session.test (ftype, flen, fstart_serial, fend_serial) values (endType, len_, startSerial, endSerial);

--写编号, 不够长度的补0  
    update session.test set fstart_code = REPEAT( '0', flen - length(rtrim(cast( fstart_serial as char(18) ))) ) || rtrim(cast( fstart_serial as char(18) )) ,
                            fend_code   = REPEAT( '0', flen - length(rtrim(cast( fend_serial as char(18) ))) ) || rtrim(cast( fend_serial as char(18) )) ;

  end if;
  ----------合并结束-------------------------------------------------------------

  --保存查询结果
  if PARA_ISSAVE =1 then
    delete from test;
    insert into test (ftype, fstart_serial, fstart_code, fend_serial, fend_code)
            select ftype, fstart_serial, fstart_code, fend_serial, fend_code from session.test;
  end if;

end if;


if PARA_ISREFRESH = 1 then
    open c_ret1; -- 1 刷新查询
else
open c_ret0; -- 0 取缓冲
end if;

end proc_test_;


--调用存储过程
call PROC_TEST(1, 1);
  • 描述: 合并前的数据
  • 大小: 2 KB
  • 描述: 合并后的数据
  • 大小: 1.8 KB
分享到:
评论

相关推荐

    bootstrap-table导出合并单元格

    在描述中提到的"bootstrap-table导出合并单元格"是该插件的一个高级特性,允许用户在导出表格时,将具有相同内容的单元格进行合并,以提高数据的可读性和美观性。 1. **Bootstrap Table简介** Bootstrap Table是一...

    table-rowspan表格自动合并单元格插件

    3. **单元格合并**:在网页开发中,如果需要将多个相邻的单元格合并成一个大单元格,可以使用`rowspan`和`colspan`属性。`colspan`与`rowspan`类似,但作用于列的跨度。合并单元格可以提高表格布局的复杂性和美感。 ...

    石子合并问题的 动态规划解法

    规定每次只能选相邻的石子合并成一堆,并将新一堆的石子数 记录为该次合并的得分。试设计一个算法,记录n堆石子合并的最大和最小得分。 数据输入:由文件input.txt输入,第一行是正整数n,表示有n堆石子。第二行有...

    合并相邻且相等的单元格

    在电子表格处理中,"合并相邻且相等的单元格"是一个常见的操作,尤其是在整理数据、美化报表或者创建模板时。这个过程可以帮助我们减少重复信息的显示,使表格更加整洁和易于阅读。以下是对这个主题的详细解释: 1....

    大数据-算法-线性相邻的knF系统可靠性分析Nurwidiyanto.pdf

    【大数据-算法-线性相邻的knF系统可靠性分析】 在信息技术领域,特别是在可靠性工程中,"大数据-算法"的概念与线性相邻的k-out-of-n (knF)系统息息相关。这种系统模型常用于模拟各种复杂的工程系统,如路灯网络、...

    294地级市-城市之间的相邻矩阵(名称版、行政代码版)

    1、数据源名称:294地级市-城市之间的相邻矩阵(名称版、行政代码版) 2、数据 来源:地理矩阵 3、数据说明:同一省份下两个城市相邻赋值为1,包括城市名称、行政 区划代码两个版本 4、参考文献: [1]乔艺波.产业溢出...

    行业-电子政务-具有寻址及相邻位的存储单元的集成电路及其操作方法.zip

    而“具有寻址及相邻位的存储单元”可能意味着该设计在保持寻址能力的同时,还增强了相邻存储位之间的关联性,这可能是为了实现更快的数据处理速度或者更高效的内存管理。 相邻位的交互在某些特定的计算任务中非常...

    miniui datagrid 合并单元格

    2. **单元格合并的概念与应用场景**:单元格合并是指在同一列中将相邻的具有相同值的多个单元格合并为一个单元格的过程。 3. **McMergeCells函数的实现逻辑**:该函数是作者原创的一种高效合并单元格的方法,通过对...

    合并内容相同的相邻单元格

    在Excel中,有时候我们需要对内容相同的相邻单元格进行合并,以简化数据展示或者优化表格布局。这个过程可以通过Excel内置的功能实现,使得操作变得便捷高效。本文将详细介绍如何在Excel中自动合并内容相同的相邻...

    行业文档-设计装置-一种与相邻两条辐射线平行的叶片内、背型面线切割工装.zip

    这种工装的设计目的是提高在叶片制造过程中的精度和效率,特别是针对那些具有复杂几何形状的叶片,例如那些其内、背型面与相邻两条辐射线平行的叶片。 在机械工程领域,叶片通常用于涡轮机、风扇、泵等设备中,它们...

    【JavaScript源代码】vue使用el-table动态合并列及行.docx

    在这个回调函数中,我们需要根据传入的参数`row`(当前行数据)、`column`(当前列的配置)、`rowIndex`(当前行索引)和`columnIndex`(当前列索引)来决定是否需要合并以及合并的范围。 2. **数据预处理** 在...

    EasyUI指定列-合并相同数据行

    ### EasyUI指定列-合并相同数据行 #### 易理解释与应用场景 在日常的数据处理过程中,经常会遇到需要对表格中的重复数据进行整理的情况。EasyUI作为一种轻量级的用户界面库,提供了丰富的功能来帮助开发者高效地...

    [Java算法-排序练习]相邻数最大差值.java

    该资源提供了在Java中如何求解相邻数最大差值的全面指南。文档中涵盖了求解相邻数最大差值的基本概念,包括如何寻找数组中相邻数的最大差值以及如何在Java中实现相邻数最大差值的算法。此外,文档还包括一个逐步指南...

    1到10的相邻数的练习题.doc

    这篇文档主要针对初学者,尤其是儿童,讲解了数学中的相邻数概念,并提供了丰富的练习题来帮助他们理解和掌握这个概念。相邻数是指在数列中一个数的前一个数和后一个数,例如,在数字1、2、3中,2的相邻数是1和3。 ...

    Arcgis融合相邻且某些属性相同的图斑且属性取面积最大的图斑批处理.tbx

    Arcgis融合相邻且某些属性相同的图斑且属性取面积最大的图斑批处理工具 流程参考https://download.csdn.net/download/yilvyangguang520/25520808

    【算法设计分析课程设计】动态规划解决石子合并问题及回溯法解决运动员匹配问题

    针对石子合并问题,本文利用动态规划算法寻求石子合并时的最大,最小得分,选择相邻的两堆石子堆进行合并,其最终花费的代价与石子堆的排列顺序有关。根据其重叠子问题建立状态转移方程,利用程序进行求解。算例结果...

    9动态规划算法2-石子合并.doc

    石子合并问题是指,我们有很多小石子,每个石子都有自己的重量和价值,我们需要将这些石子合并成一个大的石子,以便于更好地处理和存储。这个问题的目标是,找到一个合并方案,使得总的价值最大化。 二、动态规划...

Global site tag (gtag.js) - Google Analytics