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;
$$;