--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导出合并单元格"是该插件的一个高级特性,允许用户在导出表格时,将具有相同内容的单元格进行合并,以提高数据的可读性和美观性。 1. **Bootstrap Table简介** Bootstrap Table是一...
3. **单元格合并**:在网页开发中,如果需要将多个相邻的单元格合并成一个大单元格,可以使用`rowspan`和`colspan`属性。`colspan`与`rowspan`类似,但作用于列的跨度。合并单元格可以提高表格布局的复杂性和美感。 ...
规定每次只能选相邻的石子合并成一堆,并将新一堆的石子数 记录为该次合并的得分。试设计一个算法,记录n堆石子合并的最大和最小得分。 数据输入:由文件input.txt输入,第一行是正整数n,表示有n堆石子。第二行有...
在电子表格处理中,"合并相邻且相等的单元格"是一个常见的操作,尤其是在整理数据、美化报表或者创建模板时。这个过程可以帮助我们减少重复信息的显示,使表格更加整洁和易于阅读。以下是对这个主题的详细解释: 1....
【大数据-算法-线性相邻的knF系统可靠性分析】 在信息技术领域,特别是在可靠性工程中,"大数据-算法"的概念与线性相邻的k-out-of-n (knF)系统息息相关。这种系统模型常用于模拟各种复杂的工程系统,如路灯网络、...
2. **单元格合并的概念与应用场景**:单元格合并是指在同一列中将相邻的具有相同值的多个单元格合并为一个单元格的过程。 3. **McMergeCells函数的实现逻辑**:该函数是作者原创的一种高效合并单元格的方法,通过对...
1、数据源名称:294地级市-城市之间的相邻矩阵(名称版、行政代码版) 2、数据 来源:地理矩阵 3、数据说明:同一省份下两个城市相邻赋值为1,包括城市名称、行政 区划代码两个版本 4、参考文献: [1]乔艺波.产业溢出...
而“具有寻址及相邻位的存储单元”可能意味着该设计在保持寻址能力的同时,还增强了相邻存储位之间的关联性,这可能是为了实现更快的数据处理速度或者更高效的内存管理。 相邻位的交互在某些特定的计算任务中非常...
在Excel中,有时候我们需要对内容相同的相邻单元格进行合并,以简化数据展示或者优化表格布局。这个过程可以通过Excel内置的功能实现,使得操作变得便捷高效。本文将详细介绍如何在Excel中自动合并内容相同的相邻...
这种工装的设计目的是提高在叶片制造过程中的精度和效率,特别是针对那些具有复杂几何形状的叶片,例如那些其内、背型面与相邻两条辐射线平行的叶片。 在机械工程领域,叶片通常用于涡轮机、风扇、泵等设备中,它们...
在这个回调函数中,我们需要根据传入的参数`row`(当前行数据)、`column`(当前列的配置)、`rowIndex`(当前行索引)和`columnIndex`(当前列索引)来决定是否需要合并以及合并的范围。 2. **数据预处理** 在...
### EasyUI指定列-合并相同数据行 #### 易理解释与应用场景 在日常的数据处理过程中,经常会遇到需要对表格中的重复数据进行整理的情况。EasyUI作为一种轻量级的用户界面库,提供了丰富的功能来帮助开发者高效地...
该资源提供了在Java中如何求解相邻数最大差值的全面指南。文档中涵盖了求解相邻数最大差值的基本概念,包括如何寻找数组中相邻数的最大差值以及如何在Java中实现相邻数最大差值的算法。此外,文档还包括一个逐步指南...
合并规则为:每次只能选择相邻的两堆石子进行合并,并将这两堆石子的数量相加得到的新数量作为这次合并的得分。题目要求对于给定的 \(n\) 堆石子,计算出所有可能的合并方案中得分的最小值和最大值。 #### 二、输入...
代码中使用了数组`a`来存储石子的数量,数组`f`用来存储动态规划过程中的得分。通过多次迭代,最终计算出最小得分和最大得分。 #### 总结 综上所述,石子合并问题可以通过动态规划的方式解决。我们需要定义合适的...
在这个问题中,我们面临一个圆形操场上的n堆石子,目标是通过相邻两堆石子的合并,最终形成一堆。每次合并会产生一个得分,即新堆的石子数量。任务是计算合并过程中的最小得分和最大得分。 首先,我们需要理解问题...
这篇文档主要针对初学者,尤其是儿童,讲解了数学中的相邻数概念,并提供了丰富的练习题来帮助他们理解和掌握这个概念。相邻数是指在数列中一个数的前一个数和后一个数,例如,在数字1、2、3中,2的相邻数是1和3。 ...