OPEN bomTableCursor;
bom_loop:LOOP
FETCH bomTableCursor INTO parentId11,childrenId11;
IF cursorBomMark = 1 THEN
LEAVE bom_loop;
else select childrenId11;
select parentId11;
# 查询原来的模板id。
select t.part_template_id from part_template t where t.part_master_id = parentId11
limit 1 into tempOriginalParentTemplateId ; select t.part_template_id from part_template t where t.part_master_id = childrenId11
limit 1 into tempOriginalChildTemplateId ;
# 判断此次循环的父结点是否已经进行了升版。
if not exists(select * from punlishTable t where t.oraginalMasterId = parentId11) then
# 升级父结点的大版本并进行记录。
insert into version(ver_seq_id,version,create_time,update_time)
values(1,'1',sysdate(),sysdate());
insert into part(view_id,life_cycle_id,life_state_id,version_id,
type_id,creator,number,name,visibility,latest,small_latest,small_version,
create_time,update_time)
select t.view_id,t.life_cycle_id,t.life_state_id, @@IDENTITY,
t.type_id,t.creator,t.number,t.name,t.visibility,t.latest,t.small_latest,1,
sysdate(),sysdate()
from part t where t.master_id = parentId11
order by t.small_version desc
limit 1;
set tempPartId = @@IDENTITY;
update part t set t.master_id=tempPartId where t.part_id=tempPartId;
#产生产品模板的新版本。
insert into version(ver_seq_id,version,create_time,update_time)
values(1,'1',sysdate(),sysdate());
insert into part_template(life_state_id,life_cycle_id,part_master_id,
number,name,version_id,type_id,master_id,creator,visibility,
trackable,serializable,latest,small_latest,small_version,
create_time,update_time)
select 1,null,tempPartId,
t.number,t.name,@@IDENTITY,t.type_id,null,t.creator,1,
1,1,1,1,1,
sysdate(),sysdate()
from part t
where t.master_id = parentId11
limit 1;
set tempTemplateId = @@IDENTITY;
update part_template t set t.master_id = tempTemplateId where t.part_template_id = tempTemplateId ;
# 记录新升版的结点信息。
insert into punlishTable(oraginalMasterId,newMasterId,newTemplateId)
values(parentId11,tempPartId,tempTemplateId);
end if;
# 判断此次循环的子结点是否已经进行了升版。
if not exists(select * from punlishTable t where t.oraginalMasterId = childrenId11) then
# 升级子结点的大版本并进行记录。
insert into version(ver_seq_id,version,create_time,update_time)
values(1,'1',sysdate(),sysdate());
insert into part(view_id,life_cycle_id,life_state_id,version_id,
type_id,creator,number,name,visibility,latest,small_latest,small_version,
create_time,update_time)
select t.view_id,t.life_cycle_id,t.life_state_id, @@IDENTITY,
t.type_id,t.creator,t.number,t.name,t.visibility,t.latest,t.small_latest,1,
sysdate(),sysdate()
from part t where t.master_id = childrenId11
order by t.small_version desc
limit 1;
set tempPartId = @@IDENTITY;
update part t set t.master_id=tempPartId where t.part_id=tempPartId;
end if;
# 获得新父子结点最新大版本的模板id。
select newTemplateId from punlishTable t where t.oraginalMasterId = parentId11 into tempParentTemplateId;
select newTemplateId from punlishTable t where t.oraginalMasterId = childrenId11 into tempChildTemplateId;
# 获得原来版本的模板信息。
insert into part_usage_link(use_part_id,used_master_id,part_type,
effective,quantity,location,link_usage,
create_time,update_time)
select tempParentTemplateId,tempChildTemplateId,t.part_type,
t.effective,t.quantity,t.location ,t.link_usage,
sysdate(),sysdate()
from part_usage_link t
where t.use_part_id =tempOriginalParentTemplateId
and t.used_master_id =tempOriginalChildTemplateId;
if row_count() <=0 then
insert into part_usage_link(use_part_id,used_master_id,part_type,
effective,quantity,location,link_usage,
create_time,update_time)
select tempParentTemplateId,tempChildTemplateId,'cn.edu.sjtu.metro.model.part.PartTemplate',
t.effective,t.quantity,t.location ,t.link_usage,
sysdate(),sysdate()
from part_usage_link t
where t.use_part_id =parentId11
and t.used_master_id =childrenId11;
end if;
end if;
END LOOP bom_loop;
CLOSE bomTableCursor;
游标没有进行循环,什么问题呢?
只循环了一次。
set cursorBomMark = 0
是用来判断游标循环的,在每个 有WHERE的SQL语句后面
set cursorBomMark = 0
这句话有什么作用呢?
让循环继续下去IF cursorBomMark = 1 THEN
LEAVE bom_loop;
....
让循环继续下去IF cursorBomMark = 1 THEN
LEAVE bom_loop;
....
让循环继续下去IF cursorBomMark = 1 THEN
LEAVE bom_loop;
....
这个标记跟游标中的where条件有什么直接的关系吗。
where条件怎么会影响到这个标记呢?
# 必须放在声明的游标的后面。
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursorBomMark = 1;
任何1个SQL语句执行后,如果没有满足条件的记录时,会SET cursorBomMark = 1
任何1个SQL语句执行后,如果没有满足条件的记录时,会SET cursorBomMark = 1
任何1个SQL语句执行后,如果没有满足条件的记录时,会SET cursorBomMark = 1