编程小萌新一个,记录遇到的一些问题,希望对大家有用
【需求介绍】
近期小编遇到一个新需求,使用的是mysql数据库,表base_field_bill_rule有如下字段,数据库中也存在一些基础数据
现在需要将此表中的基础数据复制然后将begin_time和end_time两个时间字段的内容加一天,再将修改后的内容添加到此表中【如觉得描述不清可以留言询问哦!】
【需求分析】
此需求是要将内容先复制然后修改之后再添加,我使用的是游标和fetch into的方法,将基础数据取出来,使用游标获得单条数据,将数据修改后存入到表中
【执行问题】
因为游标获取的是表中的基础数据,那么在一边获取数据,一边添加的过程中会发生此执行过程不会停止的状态,因为游标在增加,表中的基础内容也在增加,
【解决方案】
将此表中的基础数据内容copy一份出来,现在有base_field_bill_rule和base_field_bill_rule_copy两个表的内容完全一样,在base_field_bill_rule_copy表中获取基础数据内容后经过一些修改添加到base_field_bill_rule表中即可解决上面的执行问题
【解决结果】
在mysql数据库中写了一个执行过程的函数,内容如下,成功实现了上述的功能
BEGIN
#此函数主要用于将表base_field_bill_rule_copy中的基本数据内容添加到表base_field_bill_rule中,并修改一些字段的时间
#Routine body goes here...
#此函数过程中的base_field_bill_rule_copy表中存放的是基础数据
declare stopflag int default 0;
declare field_ida varchar(50) default '';
declare rule_typea INTEGER;
declare begin_timea datetime;
declare end_timea datetime;
declare pricea INTEGER;
DECLARE min_time_unit_numa INTEGER;
DECLARE is_special_billa INTEGER;
DECLARE spe_date_ida varchar(50);
DECLARE is_enablea INTEGER;
DECLARE creator_ida varchar(50);
DECLARE create_datea datetime;
DECLARE modifier_ida varchar(50);
DECLARE modify_datea datetime;
DECLARE sort_noa INTEGER;
declare u_cur CURSOR for (select field_id,rule_type,begin_time,end_time,price,min_time_unit_num,is_special_bill,spe_date_id,is_enable,creator_id,create_date,modifier_id,modify_date,sort_no from base_field_bill_rule_copy);
#1 游标是保存查询结果的临时内存区域
#2 游标变量uname_cur保存了查询的临时结果,实际上就是查询结果集
declare continue handler for not found set stopflag=1;
#3 声明句柄,当游标变量中保存的结果都查询一遍(遍历),到达结尾,就把变量stopflag设置为1 用于循环中判断是否遍历结束
open u_cur; #打开游标
fetch next from u_cur into field_ida,rule_typea,begin_timea,end_timea,pricea,min_time_unit_numa,is_special_billa,spe_date_ida,is_enablea,creator_ida,create_datea,modifier_ida,modify_datea,sort_noa; # 游标向前走一步,取出一条记录放到变量my_uname中。
while(stopflag=0) DO # 如果游标还没到结尾,就继续循环
begin
#因为基础数据中时间是2018-01-01 10:00:00,所以如果要改成2019-3-21 10:00:00就要增加
INSERT into base_field_bill_rule VALUES(NULL,field_ida,rule_typea,date_add(begin_timea,INTERVAL '456' day),date_add(end_timea,INTERVAL '456' day),pricea,min_time_unit_numa,is_special_billa,spe_date_ida,is_enablea,creator_ida,NOW(),modifier_ida,NOW(),sort_noa);
fetch u_cur into field_ida,rule_typea,begin_timea,end_timea,pricea,min_time_unit_numa,is_special_billa,spe_date_ida,is_enablea,creator_ida,create_datea,modifier_ida,modify_datea,sort_noa;
end;
end while;
close u_cur;# 关闭游标
END
【游标的快速入门】
可能看到上面的函数已经晕了头了,不知道该如何下手,或者还需要一点时间才能看明白,下面写一些我自己在此次需求过程中的理解。先将此函数过程的内容简化如下:
BEGIN
//第一步:定义一个标志符,判定游标是否在最后一位
declare stopflag int default 0;
//第二步:根据表中的字段类型定义一些字段用来接收表中获取的数据
declare field_ida varchar(50) default '';
...
//第三步:定义一个游标名
DECLARE sort_noa INTEGER;
//第四步:查询表中的内容将其添加到游标u_cur中,游标是保存查询结果的临时内存区域
declare u_cur CURSOR for (select [添加想要查询的字段] from [从哪个表中查询内容]);
//第五步:设置标志符,判定是否遍历结束,如果结束则修改为1
declare continue handler for not found set stopflag=1;
//第六步:打开游标,将第四步中游标中保存的内容赋值到第二步中定义的各个字段
//[注意]:fetch into后面括号中的字段要和游标中保存的字段个数一致,不然就不知道那些字段是一一对应的,会出错
open u_cur;
fetch next from u_cur into [这里添加的内容就是第二步中定义的字段];
//第七步:循环内容,当stopflag=0时说明表中还有数据
while(stopflag=0) DO
begin
//根据上面几步内容,已经先把数据保存在游标中,
//再将游标中的数据和你在函数中定义的字段一一对应起来了,
//那么此时你函数中定义的字段内容就是这个时候游标获取的数据库表中的内容
//如需执行一些操作需要获取到的字段内容则可以直接使用你第二步中定义的字段
end;
end while;
close u_cur;# 关闭游标
END
如有错误之处或者写的不明白之处还希望各位大佬多多留言指点,抱拳,嚯嚯嚯!!!