1 procdure 存儲過程 用遊標循環
BEGIN
DECLARE devsn varchar(100) default null;
DECLARE serialNo varchar(40) default null;
DECLARE fcloor int(11) DEFAULT NULL ;
DECLARE nextIntime dateTime default null;
Declare modelName varchar(200) default null;
Declare maintainName varchar(200) default null;
Declare propertyName varchar(200) default null;
DECLARE flg boolean default true;
DECLARE name varchar(200) default null;
// 獲取結果集遊標
DECLARE cur CURSOR FOR
select * from ems.sheet3 where ems.sheet3.設備註冊代碼
not in (select ems.tbl_user_dev.user_dev_sn
from ems.tbl_user_dev );
// 當不能發現時設置爲false
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flg = false;
open cur;
while(flg) do
FETCH cur into devsn,name,serialNo,nextIntime,fcloor,propertyName,maintainName;
if(flg) then
insert into tbl_user_dev (tbl_user_dev.user_dev_sn,
tbl_user_dev.factory_no,
tbl_user_dev.user_dev_model_id,
tbl_user_dev.maintenance_organization_id,
tbl_user_dev.using_organization_id)
select devsn,serialNo,
(select tbl_user_dev_model.id from tbl_user_dev_model where tbl_user_dev_model.model_name=name),
(select tbl_org.id from tbl_org where tbl_org.org_name=maintainName and tbl_org.org_type='01'),
(select tbl_org.id from tbl_org where tbl_org.org_name=propertyName and tbl_org.org_type='02');
insert into tbl_elevator (
tbl_elevator.user_dev_id,
tbl_elevator.nextin_spection_date,
tbl_elevator.floor )
select (select tbl_user_dev.id from tbl_user_dev where tbl_user_dev.user_dev_sn=devsn),
nextIntime,
fcloor;
end if;
end WHILE;
close cur;
end
// 注意:當插入的值要去繼續查找時要用select 而不是 values() 而且將select的結果用擴好括起來
另外一個例子:
BEGIN
DECLARE aSn VARCHAR(45) default null;
DECLARE aFloor VARCHAR(45) default null;
DECLARE aStation VARCHAR(45) default null;
DECLARE aDoor VARCHAR(45) default null;
DECLARE done Boolean default true;
declare cur cursor for select
tbl_elevator_input.電梯註冊代碼
,
substring_index(tbl_elevator_input.層數/站數/門數
,'/',1) as floor ,
substring_index(substring_index(tbl_elevator_input.層數/站數/門數
,'/',2),'/',-1) as station ,
substring_index(tbl_elevator_input.層數/站數/門數
,'/',-1) as door
FROM tbl_elevator_input
where
length(tbl_elevator_input.層數/站數/門數
)-length(replace(tbl_elevator_input.層數/站數/門數
,'/','')) = 2
union all
select
tbl_elevator_input.電梯註冊代碼
,
substring_index(tbl_elevator_input.層數/站數/門數
,'/',1),
substring_index(substring_index(tbl_elevator_input.層數/站數/門數
,'/',2),'/',-1),
''
FROM tbl_elevator_input
where
length(tbl_elevator_input.層數/站數/門數
)-length(replace(tbl_elevator_input.層數/站數/門數
,'/','')) = 1
union all
select tbl_elevator_input.電梯註冊代碼
,substring_index(tbl_elevator_input.層數/站數/門數
,'/',1),'',''
FROM tbl_elevator_input
where
length(tbl_elevator_input.層數/站數/門數
)-length(replace(tbl_elevator_input.層數/站數/門數
,'/','')) = 0;
declare continue handler for not found set done=FALSE;
open cur;
while done DO
fetch cur into aSn,aFloor,aStation,aDoor;
if(done) then
update tbl_elevator
set tbl_elevator.floor=aFloor,
tbl_elevator.stand=aStation,
tbl_elevator.door=aDoor
where tbl_elevator.user_dev_id in
(select * from tbl_user_dev
where tbl_user_dev.user_dev_sn=aSn);
end if;
end while;
close cur;
END
3,如何給某個字段的值一次加1,並用固定的長度顯示不足的用0代替
sql 語句:
set @r=0;// 定義局部變量
update tbl_district set code = lpad(@r:=@r+1,6,'0') // 左側補0,定長爲6位