将一份SQL SERVER数据库生成的T-SQL脚本,转成ORACLE的PL/SQL,其复杂繁琐程度,远远出乎我的意料。

这份SQL SERVER脚本,里面有表,有视图,还有存储过程,以及一些自定义函数。目前,仅勉强将表、视图移植到oracle,存储过程和自定义函数,只能先放弃了。

总结如下:

一、转换工具

oracle自带工具:Oracle SQL Developer。选工具 -“移植”- 草稿编辑器

在下拉框中选择 T-SQL 到 PL/SQL(默认)

有个地方要特别注意,也是这个工具比较脑残的地方,T-SQL脚本一定要通过粘贴的途径输入到左边的输入框,这样才有转换的界面;假如你通过打开文件的方式,系统会把它当成PLSQL,根本没有下拉框出来。我刚开始就是直接打开脚本文件,心想怎么跟网上说的对不上号,几番折腾,才发现这个转换的功能。

我还下载了一个名叫“IspirerMnMTK”的东东,根本安装不上,换了几台机器都不行,不知道啥垃圾。

二、转换

1、这个ORACLE自带的工具转换功能并非万能,好多T-SQL语句都无法识别。

有这些语句存在,它就乱译一通,根本无法执行。比如一些选项,一些字段注释,甚至一些代码注释

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HDBH_BHGH_TJ_PROPVALUE]') AND type in (N'U'))

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'海啸发生次数' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'HDTJ_FORM_TJ9', @level2type=N'COLUMN', @level2name=N'TSU_TIMES'

诸如此类

像这种情况,只有先自行去掉,再给工具翻译。

2、ORACLE不支持

我这次遇到的有两个:

1)NVARCHAR(MAX)

工具翻译成 NVARCHAR2(4000)。问题是,假如一张表里,有2个或以上这样的字段,ORACLE建表时就报字段超长的错。而且,窃以为翻译成NVARCHAR2(4000)也是不准确的,所以手动改为clob。

2)标识符超长

我拿到的SQL SERVER脚本,有些字段名字起的非常长,而oracle只能支持30个字符以内,所以,也要手动修改。

三、执行

好不容易翻译好的脚本,如何执行?

用PLSQL Developer的SQL窗口,只能执行头三条语句;应当用命令窗口。但命令窗口对格式要求又比较严,有时出现一段SQL脚本,断句报错的情况。

还有就是,像这种以END;结束的,一定要另起一行,来个“/”。如:

CREATE OR REPLACE TRIGGER EVSYS_SETUPGUIDE_ID_TRG
BEFORE INSERT
ON EVSYS_SETUPGUIDE
FOR EACH ROW
BEGIN
SELECT EVSYS_SETUPGUIDE_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
/

四、总结

转换工具并非万能,尽量精简之后再进行翻译;翻译之后,还要进行修正。我最终,还是写了一个工具来做这些辅助工作。比如,字段注释,可以在自行开发的工具里使用正则表达式进行自动替换:

--SQL SERVER 的字段注解
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'海啸发生次数' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'HDTJ_FORM_TJ9', @level2type=N'COLUMN', @level2name=N'TSU_TIMES'
--oracle 的字段注解
COMMENT ON COLUMN "PCB_HDDM2"."TJDISTCODE" IS '用于统计的行政区划代码';

替换的正则表达式

EXEC\s+sys\.sp_addextendedproperty\s+@name=N'MS_Description',\s+@value=N'(?<Comment>[^']+)'\s*,\s+@level0type=N'SCHEMA',@level0name=N'dbo',\s+@level1type=N'TABLE',@level1name=N'(?<Table>[^']+)',\s+@level2type=N'COLUMN',@level2name=N'(?<Column>[^']+)'

替换成:
COMMENT ON COLUMN "${Table}"."${Column}" IS '${Comment}';

sql server t-sql脚本转成oracle plsql的更多相关文章

  1. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)

    原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin  update  某个sqlserver的表@dblink名字 .... ...

  2. 在SQL Server 2012中实现CDC for Oracle

    在上篇在SSIS 2012中使用CDC(数据变更捕获)中,介绍了如何在SSIS 2012中使用CDC,本文在此基础上介绍,如何通过Attunity提供的Change Data Capture Desi ...

  3. SQL Server的链接服务器(MySQL、Oracle、Ms_sql、Access、SYBASE)

    原文:SQL Server的链接服务器(MySQL.Oracle.Ms_sql.Access.SYBASE) 一.使用 Microsoft OLE DB Provider For ODBC 链接MyS ...

  4. sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以

    sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以eg: create table p.e_LOG_WebServer ( [BSCFlg] int, ), ) ); sel ...

  5. sql server编写通用脚本自动统计各表数据量心得

    工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...

  6. SQL Server经典sql语句大全(转)

    一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...

  7. 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC

      摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ...

  8. PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法

    逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...

  9. (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

    本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...

随机推荐

  1. 卡牌游戏(bzoj 3191)

    Description   N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字 ...

  2. Manjaro中源码安装gcc7.1

    刚刚gcc 7.1也出来了,想在使用熟悉的linux下试试,特记录如下: 准备必要的系统环境:(升级系统到最新,安装必要的工具) pacman -Syyu                        ...

  3. Cython 一篇通

    Cython的类型 1 类型定义 1.1 定义一个C变量: 1.1.1 在Cython里定义一个C变量和C语言类似,不同的地方就是在声明的最前面要加上cdef,另外,末尾不用加分号";“如: ...

  4. Codeforces 404E: Maze 1D(二分)

    题意:指令“R”机器人会向右走一步,“L”是向左.起初机器人在0位置,可以在除了0以外的任何位置放障碍,如果机器人的指令将使它走到障碍上,那这一步他会保持不动.要求让机器人最终结束的那一步一定只走过一 ...

  5. html-禁用右键、键盘F12、网页上选取内容、复制、粘贴

    摘要 为了保护我们的代码,我们需要想些办法禁止复制. css: body{     -webkit-touch-callout: none;    -webkit-user-select: none; ...

  6. 备份MySQL数据库的方法

    前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么 ...

  7. 小程序 之登录 wx.login()

    小程序的登录关键在于使用wx.login()方法后,要到取到code值传到后台, 再用小程序平台本帐号生成的appid+addsecret+code去微信接口服务取得用户唯一标识后即可登录[注意:此步 ...

  8. HDU 1011 Starship Troopers (树dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意: 题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个 ...

  9. 优雅的使用ImageGetter

      https://daihanglin.github.io/2017/10/13/imageGetter/ 1. 使用ImageGetter的场景 Android中用于显示文本的控件为textVie ...

  10. unigui控件的FASTSCRIPT封装

    unigui控件的FASTSCRIPT封装 unit fs_uniControl; interface{$i fs.inc}uses fs_iinterpreter, fs_itools, fs_ie ...