动态嵌套游标解决方案

1.业务说明:t_user表中存储着原始数据表,业务需要将这些表中存储的数据转移到ibms_equipmentbasedata_minute表中。

2.表结构:

  2.1存储表名称

1 CREATE TABLE `t_user` (
2 `id` varchar(40) NOT NULL,
3 PRIMARY KEY (`id`)
4 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2目标表

 1 CREATE TABLE `ibms_equipmentbasedata_minute` (
 2 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 3 `created_by` varchar(255) DEFAULT NULL,
 4 `created_date` datetime DEFAULT NULL,
 5 `data_damage` varchar(255) DEFAULT NULL,
 6 `energysid` int(11) DEFAULT NULL,
 7 `is_health` int(11) DEFAULT NULL,
 8 `meter_type` int(11) DEFAULT NULL,
 9 `posid` int(11) DEFAULT NULL,
10 `pro_code` varchar(255) DEFAULT NULL,
11 `timestamp` datetime DEFAULT NULL,
12 `value` double DEFAULT NULL,
13 `equid` varchar(255) DEFAULT NULL,
14 PRIMARY KEY (`id`)
15 ) ENGINE=InnoDB AUTO_INCREMENT=2730 DEFAULT CHARSET=utf8;

2.3 t_user存储的表

 1 CREATE TABLE `sgly_11011500010010010_01` (
 2 `ID` int(11) NOT NULL AUTO_INCREMENT,
 3 `timestamp` datetime DEFAULT NULL,
 4 `trendFlags` int(11) DEFAULT NULL,
 5 `status` int(11) DEFAULT NULL,
 6 `value` double DEFAULT NULL,
 7 `TRENDFLAGS_TAG` varchar(500) DEFAULT NULL,
 8 `STATUS_TAG` varchar(500) DEFAULT NULL,
 9 `created_by` varchar(30) DEFAULT NULL,
10 `created_date` datetime DEFAULT NULL,
11 `trend_flags` int(11) DEFAULT NULL,
12 PRIMARY KEY (`ID`)
13 ) ENGINE=InnoDB AUTO_INCREMENT=1810 DEFAULT CHARSET=utf8;

3.存储过程

 1 delimiter $$
 2 drop procedure if exists p_simulate_dynamic_cursor;
 3 create procedure p_simulate_dynamic_cursor()
 4 begin
 5 declare v_sql varchar(4000);
 6
 7 declare v_field varchar(4000);
 8
 9 declare v_result varchar(4000) default ‘‘;
10
11 declare cur_temp cursor for
12 select v.* from view_temp_20150701 v;
13 declare continue handler for not found set v_field = null;
14 set v_sql = ‘create view view_temp_20150701 as select t.id from t_user t‘;
15 set @v_sql = v_sql;
16 prepare statement from @v_sql;
17 execute statement;
18 deallocate prepare statement;
19 open cur_temp;
20 fetch cur_temp into v_field;
21
22 while(v_field is not null) do
23 -- declare cur_table_data cursor for select d.* from view_temp_data d;
24 -- set v_result = concat(v_result, v_field, ‘,‘);
25 CALL p2_simulate_dynamic_cursor(v_field);
26 fetch cur_temp into v_field;
27 end while;
28 close cur_temp;
29
30 drop view if exists view_temp_20150701;
31 end;
32 $$
33 delimiter ;
34 -- call p_simulate_dynamic_cursor();
35
36 -- ----------------------------另一个存储过程动态游标-------------------------------------
37 delimiter $$
38 drop procedure if exists p2_simulate_dynamic_cursor;
39
40 create procedure p2_simulate_dynamic_cursor(IN tableName varchar(4000))
41 begin
42 DECLARE done INT DEFAULT 0;
43 DECLARE equiName VARCHAR(400);
44 declare v_sql varchar(4000);
45 declare v_time TIMESTAMP;
46 declare v_value DOUBLE;
47 declare v_result varchar(4000) default ‘‘;
48 declare cur_temp cursor for select timestamp,value from view_temp_data;
49 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
50 SET equiName=SUBSTR(tableName,6,17);
51 set v_sql = concat(‘create view view_temp_data as select timestamp,value from ‘ ,tableName);
52
53
54 set @v_sql = v_sql;
55 prepare statement from @v_sql;
56
57 execute statement;
58 deallocate prepare statement;
59
60 open cur_temp;
61 fetch cur_temp into v_time,v_value;
62 while (done=0) do
63 INSERT INTO ibms_equipmentbasedata_minute(timestamp,value,equid) VALUES(v_time,v_value,equiName);
64 set v_result = concat(v_result,v_time, v_value, ‘,‘);
65 fetch cur_temp into v_time,v_value;
66 end while;
67 close cur_temp;
68 select v_result;
69
70 drop view if exists view_temp_data;
71 end;
72 $$
73 delimiter ;

4.注意事项:解决方式主要是用另一个存储过程来存储另一个嵌套的游标。

时间: 2024-10-16 17:14:14

动态嵌套游标解决方案的相关文章

SQL Server 存储过程之嵌套游标

下面是一个订单取消的含2个游标的存储过程 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[CancelOrderBySystem] AS BEGIN declare /*声明变量*/ @Status varchar(100), --状态 @TimeNow datetime, --当前时间 @TradeID varchar(50), --订单单号 @GoodsID int, --商品ID @Num int,

Asp.Net 动态调用WebServices解决方案

放狗搜索动态调用webservices 的类,太多.问题挺纠结的.公司需要net调用java的webservices接口,蛋疼的是java端的接口,全部传入String类型的数据.蛋疼啊,接口你不编写成传递参数的形式就算了,尼玛,传递的对象是String(把xml格式化成string类型,在使用报文发送),返回也是String,我纳闷了.按照这个思路,Java端接收报文数据使用Object,返回Object,接口的兼容性岂不是提高了狠多?偏题了... 1.webservices动态类代码 usi

Mysql 嵌套游标添以及任意位置声明变量的方法

在写存储过程的时候,会遇到某个游标的筛选条件来自于 先前语句运行的结果,比较常见的方式是 再写一个存储过程,通过调用来完成 动态参数的配置, 或者使用 动态sql的功能,而这两种方式都不能很好的解决这些问题. 这里,无意在baidu的时候发现可以通过在mysql的存储过程中 使用 的方式,优雅的完成 游标参数的动态筛选.

JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案

这是个小菜在实际工作中遇到的问题,相信很多EasyUI新手很可能也遇到这样的问题,因此小菜觉得有必要拿出来分享一下. 这个问题要从EasyUI的datebox组件说起,小菜用这个组件的时候,发现用$("#id").val()这种形式,居然拿不到文本框的值! 经过度娘的帮助,发现可以用$("#id").datebox('getValue'),但是这是为什么捏? 经过一翻研究和探索,小菜发现,如果一个input加上class="easyui-datebox&q

BIRT统一公用数据源、动态切换数据源解决方案

通过BIRT报表工具开发出来的报表,在运行时往往是走一个统一的生产环境数据源,但是开发时往往是一个开发测试用的数据源,这就 需要随时能够在两个环境下进行切换.目前针对这个问题,公开可检索到的资料,基本上是通过数据源的beforeopen事件,通过写脚本的方式解决,这个 方式还是比较复杂,在报表数量较多,开发人数较多时,开发人员需要注意的地方还是有些多,并不完美.本文的处理方式,将能够根本性的解决该问题. 不能在报表制作上做文章了,这样要么需要大量修改报表文件,要么需要每个报表继承一个公共的库文件

jquery 实践操作:div 动态嵌套页面

此篇记录如何在指定 div 中嵌套一个页面 load() 方法: 1. 使用 $.load() 直接导入一个页面 $('#addPage_div').load("temp/handle.html", function () { //其他操作,可对载入的 handle.html 中元素进行操作 }); 2. 加载页面片段 $("#result").load("ajax/test.html #container"); 3. 以 POST 形式发送 附

jquery 实践操作:div 动态嵌套(追加) div

此片记录在指定 div 中动态添加 div html(): append(): 在被选元素的结尾(但仍在元素内部)插入指定的内容. 语法: $(selector).append(content); //其中,参数content是必需的,指定要附加的内容. append 能够使用函数给被选元素附加内容,语法为: $(selector).append(function(index,html)); //function()是必需的,参数index和html都是可选的.index表示接收选择器的inde

SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案

背景 之前做数据抽取的时候,搭了一个mybatis动态数据源切换的架子.方便他们写抽取的代码.今天同事问我,架子里面的mybatisplus的IPage失效了是什么问题.想了一下,应该是写动态数据源的时候,我自定义的mybatis的配置覆盖了已有的配置.于是我让他先把我写的配置进行删除,看是否正常.得到回复,删除后正常.那么到此问题原因找到,接下来的解决方法,只要在配置中增加分页器即可. 解决方案 建立一个分页器的bean配置 @Bean public PaginationInterceptor

Oracle 动态SQL语句

Oracle 动态SQL语句 (2012-06-18 16:36:12) 转载▼ 标签: oracle it   EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTEIMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTEIMMEDIATE,因为它获的收益在包