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 back
v_path OUT VARCHAR2, -- This one too
v_query OUT VARCHAR2) -- And this one
IS
a_pos1 INTEGER;
a_pos2 INTEGER;
BEGIN
v_host :=NULL;
v_path :=NULL;
v_query :=NULL;
a_pos1 := instr(v_url, '//');
IF a_pos1 =0THEN
RETURN;
END IF;
a_pos2 := instr(v_url, '/', a_pos1 +2);
IF a_pos2 =0THEN
v_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 =0THEN
v_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 OUTvarchar, -- This will be passed back
v_path OUTvarchar, -- This one too
v_query OUTvarchar -- And this one
)
LANGUAGE plpgsql
AS $$
DECLARE
a_pos1 integer;
a_pos2 integer;
next_slash_pos integer;
relative_query_pos integer;
BEGIN
v_host :=NULL;
v_path :=NULL;
v_query :=NULL;
a_pos1 :=position('//'in v_url);
IF a_pos1 =0THEN
RETURN;
END IF;
next_slash_pos :=position('/'insubstring(v_url from a_pos1 +2));
IF next_slash_pos =0THEN
v_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 +2for a_pos2 - a_pos1 -2);
relative_query_pos :=position('?'insubstring(v_url from a_pos2 +1));
IF relative_query_pos =0THEN
v_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;
$$;

