SQLShift:一款异构数据库存储过程迁移工具
SQLShift 是一款专注于解决企业级数据库迁移难题的智能 SQL 方言转换平台,尤其擅长异构数据库存储过程的自动化迁移。
SQLShift 工具深度融合了 AI 与 SQL 语法专家模型,可以大幅提升迁移效率并降低人工适配风险。
功能特性
- 多源多目标:目前支持 Oracle 迁移 PostgreSQL、Oracle 迁移 OceanBase、SQL Server 迁移 GaussDB,其他迁移路径正在开发中。
- 智能语法转换:深度集成 AI 以及 SQL 语法专家模型,动态学习源端和目标端数据库语法规则,支持自动重构源端存储过程、触发器、函数、包等对象为目标端语法,降低人工改写成本。
- 推理路径追踪:拆解存储过程、触发器等复杂对象中的转换步骤,提供转换原理说明,降低用户理解成本。
- 批量并发处理:支持同时上传上百个复杂对象,自动分发处理转换任务,大幅提升转换效率。
- 风险预判机制:对于无法自动转换的语法,生成专家级修复介入建议。
版本比较
SQLShift 目前提供了个人免费在线体验、支持订阅的标准版以及可定制化的企业版,它们的功能差异如下:
免费试用
SQLShift 提供了免费的在线试用额度,输入以下网址进行注册登录:
https://sqlshift.cn/app/login/
登录之后,点击页面左下角“领取额度”:
输入兑换码“83103ce2-9167-439c-a03c-532c911fb516”领取有效期为 30 天的 10 次免费额度,数量有限,先到先得。
接下来我们创建一个新的迁移项目,点击页面左侧“新建项目”按钮:
选择源端数据库(例如 Oracle)以及目标端数据库(例如 PostgreSQL),设置项目名称之后点击“确认”按钮。
然后选择这个新项目,点击“新建转换任务”按钮:
在“源端SQL”中输入以下 PL/SQL 代码:
CREATE OR REPLACE PROCEDURE cs_parse_url(v_url IN VARCHAR2,v_host OUT VARCHAR2, -- This will be passed backv_path OUT VARCHAR2, -- This one toov_query OUT VARCHAR2) -- And this one
ISa_pos1 INTEGER;a_pos2 INTEGER;
BEGINv_host := NULL;v_path := NULL;v_query := NULL;a_pos1 := instr(v_url, '//');IF a_pos1 = 0 THENRETURN;END IF;a_pos2 := instr(v_url, '/', a_pos1 + 2);IF a_pos2 = 0 THENv_host := substr(v_url, a_pos1 + 2);v_path := '/';RETURN;END IF;v_host := substr(v_url, a_pos1 + 2, a_pos2 - a_pos1 - 2);a_pos1 := instr(v_url, '?', a_pos2 + 1);IF a_pos1 = 0 THENv_path := substr(v_url, a_pos2);RETURN;END IF;v_path := substr(v_url, a_pos2, a_pos1 - a_pos2);v_query := substr(v_url, a_pos1 + 1);
END;
/
点击“确认”开始转换过程,转换完成后可以看到对应的 PL/pgSQL 代码,以及相关说明。
对于上面的示例,转换后的 PL/pgSQL 代码如下:
CREATE OR REPLACE FUNCTION cs_parse_url(v_url varchar,v_host OUT varchar, -- This will be passed backv_path OUT varchar, -- This one toov_query OUT varchar -- And this one
)
LANGUAGE plpgsql
AS $$
DECLAREa_pos1 integer;a_pos2 integer;next_slash_pos integer;relative_query_pos integer;
BEGINv_host := NULL;v_path := NULL;v_query := NULL;a_pos1 := position('//' in v_url);IF a_pos1 = 0 THENRETURN;END IF;next_slash_pos := position('/' in substring(v_url from a_pos1 + 2));IF next_slash_pos = 0 THENv_host := substring(v_url from a_pos1 + 2);v_path := '/';RETURN;END IF;a_pos2 := a_pos1 + 1 + next_slash_pos;v_host := substring(v_url from a_pos1 + 2 for a_pos2 - a_pos1 - 2);relative_query_pos := position('?' in substring(v_url from a_pos2 + 1));IF relative_query_pos = 0 THENv_path := substring(v_url from a_pos2);RETURN;END IF;a_pos1 := a_pos2 + relative_query_pos;v_path := substring(v_url from a_pos2 for a_pos1 - a_pos2);v_query := substring(v_url from a_pos1 + 1);
END;
$$;