Mysql动态嵌套游标

前提:

表一、 ddm_demand

system_id demand_id quotate_end_team 1 1 team1,team5,team2 1 2 tea3,team1,team,4

pk:quotate_end_team、demand_id;

表二、 mc_team

team_nam view_order team1 1 team2 2

解决问题:

将表一中的quotate_end_team字段按照表二的view_order重新排序。

方法:

DELIMITER $$
DROP PROCEDURE IF EXISTS order_team_name $$

CREATE PROCEDURE order_team_name()

BEGIN

declare order_before_teams text ;
declare temp_team_nam text;
declare systemId decimal(10,0) unsigned;
declare demandId char(6);
declare done int;

-- 定义游标1

DECLARE rs_cursor CURSOR FOR SELECT system_id,demand_id,quotate_end_team FROM ddm_demand;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

open rs_cursor;
cursor_loop:loop

FETCH rs_cursor into systemId,demandId,order_before_teams;

if done=1 then
leave cursor_loop;
end if;
if order_before_teams is not null and order_before_teams <> '' then
SET @sqlstr = concat("where team_nam in ('",replace(order_before_teams,",","','"),"');");
SET @sqlstr = concat("CREATE VIEW temporary_team_view as SELECT team_nam,view_order FROM mc_team ",@sqlstr);
-- DROP VIEW IF EXISTS temporary_team_view;
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;

-- 调用游标2

CALL update_ddm_demand(systemId,demandId);
drop view temporary_team_view;
end if;

end loop cursor_loop;
close rs_cursor;
END$$

DROP PROCEDURE IF EXISTS update_ddm_demand $$

CREATE PROCEDURE update_ddm_demand(systemId decimal(10,0) unsigned,demandId char(6))

BEGIN
declare temp_team_nam text;
declare order_after_teams text;
declare done int;

-- 定义游标2
DECLARE rs_cursor CURSOR FOR SELECT team_nam FROM temporary_team_view order by view_order;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
SET order_after_teams = "";
open rs_cursor;
cursor_loop:loop

FETCH rs_cursor into temp_team_nam;

if done=1 then
leave cursor_loop;
end if;

-- 更新表
SET order_after_teams = concat(order_after_teams,",",temp_team_nam);

end loop cursor_loop;

update ddm_demand set quotate_end_team = subString(order_after_teams,2) where system_id = systemId and demand_id = demandId;

close rs_cursor;
END$$

DELIMITER ;

call order_team_name;

时间: 2024-09-18 02:08:08

Mysql动态嵌套游标的相关文章

mysql 存储过程中游标与多游标实例

例  代码如下 复制代码 DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$ CREATE PROCEDURE getUserInfo(in date_day datetime) -- -- 实例 -- MYSQL存储过程名为:getUserInfo -- 参数为:date_day日期格式:2008-03-08 --     BEGIN declare _userName varchar(12); -- 用户名 declare _chines

MySQL动态添删改列字段

好吧,我承认是自己项目中重大的失误,在这个项目试运行期间,对数据库字段的长度以及字段的值进行修改了两次,为了不影响里边已经存在的数据,那么我只能是再次寻找一种方法去动态增删改列字段 动态增加列字段 ? 1 alter table TableName drop column field_id; 动态删除列字段 ? 1 alert TABLE table_name change old_field_name new_field_name field_type; 动态修改列字段 ? 1 alert T

mysql 存储过程中游标临时表问题

问题描述 mysql 存储过程中游标临时表问题 DELIMITER $$ USE laolao$$ DROP PROCEDURE IF EXISTS parent_sport_sort1$$ CREATE DEFINER=root@% PROCEDURE parent_sport_sort1(IN jidb VARCHAR(64),IN uname VARCHAR(64),IN starttime VARCHAR(64),IN endtime VARCHAR(64), IN startmonth

【MySql】MySql存储,游标,循环的简单使用

MySql存储,游标,循环 CREATE PROCEDURE `copy_group`(IN v_sourcegroupid int,IN v_destgroupid int,IN v_projectid int) BEGIN       --声明变量       declare v_oldtestcaseid int;       declare v_testcaseid int;       declare v_stepid int;       declare v_id int;    

代码-MySql动态行转列,网上找的sql语句,需要再添加字段,求帮忙谢谢大家

问题描述 MySql动态行转列,网上找的sql语句,需要再添加字段,求帮忙谢谢大家 SELECT -> IFNULL(c1,'total') AS total, -> SUM(IF(c2='B1',c3,0)) AS B1, -> SUM(IF(c2='B2',c3,0)) AS B2, -> SUM(IF(c2='B3',c3,0)) AS B3, -> SUM(IF(c2='B4',c3,0)) AS B4, -> SUM(IF(c2='total',c3,0))

嵌套查询-关于mysql的嵌套查寻数据丢失的问题

问题描述 关于mysql的嵌套查寻数据丢失的问题 上周发现在mysql嵌套查询的时候有数据丢失示例如下: 情况1: select group_concat(p.prod_no separator ',') prod_no from core_request_prod 情况2: select * from (select group_concat(p.prod_no separator ',') prod_no from core_request_prod) d 情况1可以查出全部的数据(数据很多

mysql存储过程之游标遍历数据表

原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕迹. 1 BEGIN 2 DECLARE Done INT DEFAULT 0; 3 4 DECLARE CurrentLingQi INT; 5 6 DECLARE ShizuName VARCHAR(30); 7 /* 声明游标 */ 8 DECLARE rs CURSOR FOR SELECT

Mysql高级之游标

原文:Mysql高级之游标 什么是游标?select 语句也许一次性会取出来n条语句,那么游标便可以一次取出来select中的一条记录.每取出来一条,便向下移动一次!可以实现很复杂逻辑! 上面还有有一个问题,会多出来一条记录,怎样搞定? 原因在于continue,而不是选择exit: 如果用continue不行吗?是可以的,没发现上面带有逻辑上有点小问题吗?这样解决:调节一下顺序 可见有n多种方法,不就是语法问题吗!

MySQL动态字符串处理DYNAMIC_STRING_Mysql

MySQL中,常常会看到一些关于动态字符串的处理,列如:DYNAMIC_STRING. 为了记录动态字符串的实际长度,缓冲区的最大长度,以及每次字符串需要调整时,及时分配新的内存,以及调整长度.MySQL使用了DYNAMIC_STRING来保存动态字符串相关的信息: typedef struct st_dynamic_string { char *str; size_t length, max_length, alloc_increment; } DYNAMIC_STRING; 在这个结构体中,