首页 > 解决方案 > 创建映射并在 MySQL 存储过程中使用它

问题描述

我正在做一个迁移项目,数据需要从系统A迁移到系统B。系统A和系统B中的id会不同。因此维护一个包含源列和目标列的表。

作为迁移的一部分,对于来自源 A 的每条记录,我需要去映射表中找到对应的目标值。我只是想避免为每个查询查询映射表。有没有办法将映射表存储为存储过程中的键值映射并查询映射而不是直接访问表?

我在 MySQL 存储过程中搜索集合,但没有找到任何东西。

数据库 A:-

表:员工

---------------------------------
id    |  name  |       email     |
---------------------------------
10021 |  First1 | first@test.com |
---------------------------------
10035 |  First 2| first@test.com |
---------------------------------

数据库 B:-

表:员工

---------------------------------
id    |  name  |       email     |
---------------------------------
1     |  First1 | first@test.com |
---------------------------------
2     |  First 2| first@test.com |
---------------------------------

表: emp_mapping

----------------------
source_id | target_id|
----------------------
10021     |  1       | 
----------------------
10035     |  2       |
----------------------

迁移的存储过程

DELIMITER //
CREATE PROCEDURE LoadEmployees()
BEGIN
 DECLARE db1_empl_id INT;
 DECLARE db1_empl_name VARCHAR(20);
 DECLARE db1_empl_email VARCHAR(40);

 DECLARE db2_empl_id INT;

 DECLARE cur CURSOR FOR SELECT id, name, email FROM db1.employees;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_finished = 1;

 
 open cur;
    cur_loop: LOOP
       FETCH cur INTO db1_empl_id, db1_empl_name, db1_empl_email;
                 
       IF cursor_finished = 1 THEN 
          LEAVE cur_loop;
       END IF;
       -- cursor loop statements
       
       -- I would like to move this to a map instead of querying for each record
       select target_id into db2_empl_id from db2.emp_mapping where source_id = db1_empl_id;
       
       insert into db2.employee(id,name,email) values(db2_empl_id, db1_empl_name, db1_empl_email);
       
       SET cursor_finished = 0; -- hence reset this value for cursor.
         
    end LOOP;
 close cur;
END //

DELIMITER ;

标签: mysqlstored-procedures

解决方案


推荐阅读