如何将生成INSERT语句的SQL脚本转换为Oracle?是否有转换工具?
SQL Server转Oracle INSERT生成脚本的转换方案及工具建议
转换后的Oracle脚本
DECLARE START_YEAR NUMBER := 2010; END_YR NUMBER := 2010; MONTH NUMBER := 1; BEGIN_DATE VARCHAR2(10); END_DATE VARCHAR2(10); CURRENT_DT VARCHAR2(16); BEGIN WHILE START_YEAR <= END_YR LOOP WHILE MONTH <= 12 LOOP -- 计算当月第一天 BEGIN_DATE := TO_CHAR(ADD_MONTHS(TO_DATE(START_YEAR || '-01-01', 'YYYY-MM-DD'), MONTH - 1), 'YYYY-MM-DD'); -- 计算当月最后一天 END_DATE := TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(START_YEAR || '-01-01', 'YYYY-MM-DD'), MONTH - 1)), 'YYYY-MM-DD'); -- 获取当前格式化日期 CURRENT_DT := TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI'); DBMS_OUTPUT.PUT_LINE('INSERT INTO Mem_TXN (VALUE, BEGIN_DATE, END_DATE, CREATED_BY, CREATED_DATE, MODIFIED_BY, MODIFIED_DATE) ' || 'VALUES (''RGLR'', ''' || BEGIN_DATE || ''', ''' || END_DATE || ''', ''admin'', ' || '''' || CURRENT_DT || ''', ''admin'', ''' || CURRENT_DT || ''');'); MONTH := MONTH + 1; END LOOP; MONTH := 1; START_YEAR := START_YEAR + 1; END LOOP; END; /
关键语法差异说明
- 变量声明:Oracle使用
DECLARE块集中声明变量,直接用:=赋值,无需SQL Server的SELECT赋值逻辑;数据类型用NUMBER替代INT,字符串类型用VARCHAR2。 - 日期处理:用
ADD_MONTHS替代DATEADD做月份偏移,TO_DATE/TO_CHAR完成日期与字符串的互转;LAST_DAY函数可直接获取当月最后一天,比SQL Server的写法更简洁。 - 输出逻辑:用
DBMS_OUTPUT.PUT_LINE替代PRINT,执行前需确保会话开启输出(比如执行SET SERVEROUTPUT ON)。 - 字符串拼接:Oracle用
||替代+做字符串连接操作。 - 表名规则:Oracle默认无需
dbo.前缀,直接使用表名即可。
可用的SQL转换工具
- Oracle SQL Developer Migration Workbench:Oracle官方自带迁移工具,可直接导入SQL Server脚本,自动转换大部分语法,还会生成迁移报告标注未自动转换的内容。
- SQLines:支持SQL Server到Oracle的语法转换,能处理存储过程、函数、批量脚本等,有免费版和付费版,转换准确率较高。
- ApexSQL Convert:专注数据库脚本跨平台转换,支持多种数据库间的语法迁移,适合复杂脚本的批量处理场景。
内容的提问来源于stack exchange,提问作者Deepak Ananth
相关产品推荐
相关产品推荐

