存储过程游标的遍历

DELIMITER $$

USE `yuntp`$$

DROP PROCEDURE IF EXISTS `p_copy_userdata`$$

CREATE DEFINER=`root`@`%` PROCEDURE `p_copy_userdata`(IN in_site_code VARCHAR(100),IN in_parentId INT,IN in_new_parentId INT)
BEGIN
 
DECLARE Done INT DEFAULT 0;
DECLARE c_client_id VARCHAR(30);
DECLARE c_contacter VARCHAR(30);
DECLARE c_contacter_status INT;
DECLARE c_data_timestamp VARCHAR(30);
DECLARE c_name VARCHAR(200);
DECLARE c_phones VARCHAR(30); 
DECLARE c_update_id INT;
DECLARE l_data_timestamp VARCHAR(30);
DECLARE l_head_photo VARCHAR(200);
DECLARE l_install_id INT;
DECLARE l_name VARCHAR(30);
DECLARE l_q_order INT;
DECLARE l_phone VARCHAR(30); 
DECLARE l_l_order INT;
DECLARE l_device_id INT;
DECLARE e_head_photo VARCHAR(200);
DECLARE e_install_id INT;
DECLARE e_last_update_date VARCHAR(30);
DECLARE e_last_update_user VARCHAR(30);
DECLARE e_name VARCHAR(200); 
DECLARE e_e_order INT;
DECLARE e_phone VARCHAR(200);
DECLARE e_device_id INT;

DECLARE pw_photos VARCHAR(200);
DECLARE pw_title VARCHAR(200);
DECLARE pw_update_member_num INT;
DECLARE pw_update_time VARCHAR(30);
DECLARE pw_update_uid INT; 
DECLARE pw_update_uname VARCHAR(200);
DECLARE pw_update_user_headphoto VARCHAR(200);
  
/*联系人的复制*/
DECLARE cur CURSOR FOR  SELECT client_id,contacter,contacter_status,data_timestamp,NAME,phones,update_id FROM contacter WHERE parent_id = in_parentId;
/*快捷联系人的复制*/
DECLARE cur_1 CURSOR FOR  SELECT data_timestamp,head_photo,install_id,NAME,q_order,phone,l_order,device_id FROM lnkman  WHERE parent_id = in_parentId;
/*紧急联系人的复制*/
DECLARE cur_2 CURSOR FOR  SELECT head_photo,install_id,last_update_date,last_update_user,NAME,e_order,phone,device_id FROM emergency  WHERE parent_id = in_parentId;
/*照片墙的复制*/
DECLARE cur_3 CURSOR FOR  SELECT photos,title,update_member_num,update_time,update_uid,update_uname, update_user_headphoto FROM photo_wall  WHERE parent_id = in_parentId;
 /* 异常处理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
/*联系人的复制*/    
/* 打开游标 */
 OPEN cur; 
-- 开始循环
  read_loop: LOOP
    -- 提取游标里的数据,这里只有一个,多个的话也一样;
    FETCH cur INTO c_client_id,c_contacter,c_contacter_status,c_data_timestamp,c_name,c_phones,c_update_id;
    -- 声明结束的时候
    IF done THEN
      LEAVE read_loop;
    END IF;
    -- 这里做你想做的循环的事件,如果记录不存在则复制数据
    SELECT  @c_id:=id FROM contacter WHERE phones = c_phones AND parent_id = in_new_parentId;   
    IF @c_id IS  NULL  THEN 
    INSERT INTO contacter (site_code,client_id,contacter,contacter_status,data_timestamp,NAME,parent_id,phones,update_id) VALUES (in_site_code,c_client_id,c_contacter,
    c_contacter_status,c_data_timestamp,c_name,in_new_parentId,c_phones,c_update_id); 
    END IF;
  END LOOP;
  /* 关闭游标 */
   CLOSE cur; 
    
    
-- 注意这里,一定要重置done的值为 0
SET done = 0;
/*快捷联系人的复制   
/* 打开游标 */
OPEN cur_1; 
-- 开始循环
  read_loop: LOOP
    -- 提取游标里的数据,这里只有一个,多个的话也一样;
    FETCH cur_1 INTO l_data_timestamp,l_head_photo,l_install_id,l_name,l_q_order,l_phone,l_l_order,l_device_id;
    -- 声明结束的时候
    IF done THEN
      LEAVE read_loop;
    END IF;
  
    -- 这里做你想做的循环的事件,如果记录不存在则复制数据
    SELECT  @l_id:=id FROM lnkman WHERE phone = l_phone AND parent_id = in_new_parentId;   
    IF @l_id IS  NULL  THEN 
    INSERT INTO lnkman (site_code,data_timestamp,head_photo,install_id,NAME,q_order,phone,parent_id,l_order,device_id) VALUES (in_site_code,l_data_timestamp,l_head_photo,
    in_new_parentId,l_name,l_q_order,l_phone,in_new_parentId,l_l_order,l_device_id); 
    END IF;
  END LOOP;
  /* 关闭游标 */
   CLOSE cur_1;
 
-- 注意这里,一定要重置done的值为 0
SET done = 0;
   /*紧急联系人的复制   
/* 打开游标 */
OPEN cur_2; 
-- 开始循环
  read_loop: LOOP
    -- 提取游标里的数据,这里只有一个,多个的话也一样;
    FETCH cur_2 INTO e_head_photo,e_install_id,e_last_update_date,e_last_update_user,e_name,e_e_order,e_phone,e_device_id;
    -- 声明结束的时候
    IF done THEN
      LEAVE read_loop;
    END IF;
    -- 这里做你想做的循环的事件,如果记录不存在则复制数据
    SELECT  @e_id:=id FROM emergency WHERE phone = e_phone AND parent_id = in_new_parentId;   
    IF @e_id IS  NULL  THEN 
    INSERT INTO emergency (site_code,head_photo,install_id,last_update_date,last_update_user,NAME,e_order,parent_id,phone,device_id) VALUES (in_site_code,e_head_photo,
    e_install_id,e_last_update_date,e_last_update_user,e_name,e_e_order,in_new_parentId,e_phone,e_device_id); 
    END IF;
  END LOOP;
  /* 关闭游标 */
   CLOSE cur_2;
  
  
-- 注意这里,一定要重置done的值为 0
SET done = 0;
   /*紧急联系人的复制   
/* 打开游标 */
OPEN cur_3; 
-- 开始循环
  read_loop: LOOP
    -- 提取游标里的数据,这里只有一个,多个的话也一样;
    FETCH cur_3 INTO pw_photos,pw_title,pw_update_member_num,pw_update_time,pw_update_uid,pw_update_uname, pw_update_user_headphoto;
    -- 声明结束的时候
    IF done THEN
      LEAVE read_loop;
    END IF;
    -- 这里做你想做的循环的事件,如果记录不存在则复制数据
    SELECT  @pw_id:=id FROM photo_wall WHERE photos = pw_photos AND parent_id = in_new_parentId;   
    IF @pw_id IS  NULL  THEN 
    INSERT INTO photo_wall (site_code,parent_id,photos,title,update_member_num,update_time,update_uid,update_uname, update_user_headphoto) VALUES (in_site_code,
    in_new_parentId,pw_photos,pw_title,pw_update_member_num,pw_update_time,in_new_parentId,pw_update_uname, pw_update_user_headphoto); 
    END IF;
  END LOOP;
  /* 关闭游标 */
   CLOSE cur_3;
  END$$

DELIMITER ;

猜你喜欢

转载自jieke-zj.iteye.com/blog/2287842
今日推荐