开发者社区> walb呀> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

从SQL Server数据库转到Oracle数据库的数据脚本处理

简介:
+关注继续查看

在我们很多情况下的开发,为了方便或者通用性的考虑,都首先考虑SQL Server数据库进行开发,但有时候客户的生产环境是Oracle或者其他数据库,那么我们就需要把对应的数据结构和数据脚本转换为对应的数据库,数据结构一般来说,语法都遵循了SQL92的标准,或者我们根据不同的PowerDesigner文件进行生成对应的结构脚本即可,但是实际数据的脚本我们就需要进行一定的处理,以及文本的替换处理了,本文结合Notepad++的文本正则表达式替换,实现一些如日期较为特殊的数据脚本调整,把它从SQL Server转换为Oracle的处理过程,本文就是针对这些整体的数据库处理进行介绍。

1、数据库设计文件及数据库结构脚本

我们一般在做数据库设计的时候,都会使用PowerDesigner这样的数据库建模工具进行设计,默认把它设计为SQL Server的数据库设计模型,如下所示。

当然我们如果需要其他数据库,那么把它转换为对应的数据库,然后进行一定的数据库类型调整,以及字段的大小写转换即可。

 

根据这种方式我们调整后的各种数据库设计文件如下所示。

不同的数据库的设计模型有所差异,那么我们进行一些核对,主要是数据库类型的核对即可,如备注字段的大文本应该设置为CLOB,二进制的应该调整为BLOB等

例如对于Oracle的数据库设计(从SQL Server转换过来的),同时也需要把它的字段名转换为大写才好,在PowerDesigner里面可以执行自定义函数进行处理。

其中在对话框选择打开对应的大写字段表名的脚本,如下操作。

为了大家方便使用,我把它贴出来,供使用。

'文件:powerdesigner.ucase.VBs
'版本:1.0
'功能:遍历物理模型中的所有表,将表名、表代码、字段名、字段代码全部由小写改成大写;
' 并将序列的名和代码由小写改成大写。
'用法:打开物理模型,运行本脚本(Ctrl+Shift+X)
'备注:
'*****************************************************************************
dim model 'current model
set model = ActiveModel

If (model Is Nothing) Then
MsgBox "There is no current Model"
ElseIf Not model.IsKindOf(PdPDM.cls_Model) Then
MsgBox "The current model is not an Physical Data model."
Else
ProcessTables model
ProcessSequences model
End If

'*****************************************************************************
'函数:ProcessSequences
'功能:递归遍历所有的序列
'*****************************************************************************
sub ProcessSequences(folder)
'处理模型中的序列:小写改大写
dim sequence
for each sequence in folder.sequences
sequence.name = UCase(sequence.name)
sequence.code = UCase(sequence.code)
next
end sub

'*****************************************************************************
'函数:ProcessTables
'功能:递归遍历所有的表
'*****************************************************************************
sub ProcessTables(folder)
'处理模型中的表
dim table
for each table in folder.tables
if not table.IsShortCut then 
ProcessTable table
end if
next
'对子目录进行递归
dim subFolder
for each subFolder in folder.Packages
ProcessTables subFolder
next 
end sub

'*****************************************************************************
'函数:ProcessTable
'功能:遍历指定table的所有字段,将字段名由小写改成大写,
' 字段代码由小写改成大写
' 表名由小写改成大写 
'*****************************************************************************
sub ProcessTable(table)
dim col
for each col in table.Columns
'将字段名由小写改成大写
col.code = UCase(col.code)
col.name = UCase(col.name)
next 
table.name = UCase(table.name)
table.code = UCase(table.code)
end sub

这样处理后,我们在PowerDesigner里面的表名及字段就可以正常转换为大写了,从而可以获得对应表的数据结构脚本,如果需要多个表,那么可以批量生成数据库结构脚本。

2、数据库表数据脚本的生成

上面的数据库表结构的脚本生成,只是我们数据库迁移脚本的一部分操作,有时候我们实际的框架或者业务系统里面,都往往有一些基础数据需要写入的,那么就需要我们构建对应的数据脚本了。

在数据库脚本导出的,我们可以使用很多工具,如SQL Server本身的工具就可以导出数据的SQL脚本,同时我们也可以利用其它数据库管理工具,如Toad For SQLServer或者Navicat Premium等数据库管理工具实现数据的导出脚本操作。

然后在生成脚本的过程中,设置输出的高级选项中的“要编写脚本的数据的类型”为【仅限数据】即可,如下所示。

不过默认采用SQLServer生成出来的数据脚本,对日期类型转换真不是很好,如下结果所示。

因此我使用更加直观显示的Navicat Premium 工具来处理数据库的数据脚本。使用Navicat Premium生成的脚本如下所示(仅仅日期类型有所不同)。

获得生成的数据脚本如下所示。

剩下的工作就是我们对这些数据脚本进行进一步的处理操作了。

3、数据表的数据脚本的替换处理

上面介绍了通过工具来获得正确的数据脚本,我们使用了Navicat Premium或者 Toad For SQLServer都能够获得类似下面格式的时间脚本。

 N'2016-06-22 10:35:36.590'

这样我们为了处理为Oracle的日期数据,那么需要转换为

to_date('2016-06-22 10:35:36','yyyy-MM-dd HH24:mi:ss')

这样的格式

 那么我们对上面的脚本,进行一定规则的处理,如替换:[dbo]. [ ] N'为' 等常规文本处理后,还需要再进行正则表达式规则的处理才可以,例如我们的日期替换的正则表达式如下:

'(\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2})\.\d{3}'
to_date\('\1','yyyy-MM-dd HH24:mi:ss'\)

如下所示。

最后使用正则表达式替换后的数据库脚本如下所示。

4、数据脚本在PL-SQL Developer工具上执行操作

上面介绍如何实现了表数据的脚本生成,有了这些脚本,我们需要使用Oracle的数据库管理工具 PL-SQL Developer工具进行数据导入,才能最终完成整个过程。这个操作也是有所讲究的。

例如我们创建各类不同的数据库脚本,那么只需要按照顺序加入或者选择加入执行数据库脚本即可。

那么执行这些SQL,该如何操作呢,是不是直接拖动到PL-SQL上就可以了?

当然不是,否则长一点的数据库脚本,就可能导致非常迟缓的执行效率。

一般可以通过两种方式,一种是使用命令行的方式。

这种方式执行速度非常快,比起直接在PL-SQL的SQL窗口上执行更有效率。

另外一种方式,就是可以利用PL-SQL里面的另外一个地方进行执行数据库脚本,如下所示。

在【 工具】【导入表】的操作里面,弹出一个对话框,也是执行脚本高效的操作之一。

上面介绍的这些方式,就是在数据库没有的情况下,根据数据库脚本构建对应的数据对象和数据的。

本文转自博客园伍华聪的博客,原文链接:从SQL Server数据库转到Oracle数据库的数据脚本处理,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQL数据库学习之路(九)
目录   数据库创建补充: 为数据库用户赋予权限 在数据库表中使用视图进行添加修改 数据库创建补充: 以文本格式显示自己创建的数据库表                                          以网格格式显示自己创建的数据库表 可以右键数据库--属性---选项,在选项中可以设置数据库的兼容性,还有是否可以让多人同时访问或者单人访问。
888 0
SQL数据库学习之路(练习)---C#登录界面连数据库
目录 C#登录界面连数据库 一、在数据库中先创建一个数据库。 二、在VS中创建C#的windows窗体应用程序 三、在VS中连接到数据库 四、设计登录界面 五、设置注册界面 六、将form1的按钮和form2进行关联 七、设置form2界面的注册按钮 八、form1的登录按钮设置 九、运行成果 参考文章: C#登录界面连数据库 一、在数据库中先创建一个数据库。
2785 0
SQL数据库学习之路(八)
数据库介绍: 在网页上的主程序中进行注册操作,然后把数据发送给人,人传递这些数据到数据库当中。   为什么学ADO.NET:之前我们所学的只能在查询分析器中查看数据,操作数据。
893 0
SQL数据库学习之路(七)
在SQL server managerment中可以点击帮助,会有帮助文档。 一、联合查询 将多个查询结果集合并成一个。
833 0
SQL数据库学习之路(六)
一、连接查询:当需要的结果需要从多张表中取时 关键问题:哪些表、关系(学生表的Id联系到班级表的Id) 内连接:inner join,两表中完全匹配的数据。
922 0
SQL数据库学习之路(四)
要求:通过SQL语句创建以下基本表:    教师关系 T(T#, TNAME,TITLE)    课程关系 C(C#,CNAME,T#)    学生关系 S(S#,SNAME,AGE,SEX)    选课关系SC(S#,C#,SCORE)    班级关系CLASS(CLASSID,CLASSNAME)    其中红色粗体为主键,带下划线的属性为外键。
825 0
SQL数据库学习之路(三)
一.表数据的操作 1.简单查询 select * from 表名 2.增加数据 insert into 表名(列名) values(值)                   ----要求值的列名与值要位置对应   ...
801 0
SQL数据库学习之路(二)
(一)1.约束:实现数据的有效性检查---------主键(保证值是唯一的) 2.非空(输入的数据不允许为空) 3.唯一(存入的数据不能重复) 4.默认(自己不给数据添加值,值会默认添加) 5.检查(给值一个选定的范围) 6.外键(对关系的有效性进行检查,有关系才有外键) (二)脚本操作数据库 1.不区分大小写,字符串使用单引号,末尾不需要加分号。
815 0
SQL数据库学习之路(一)
1.数据库简介(一个放数据的仓库)  解决的问题:持久化存储,优化读写,保证数据的有效性 关系型数据库:    基于E-R模型(实体-联系图Entity Relationship)    使用sq|语言进行操作(SQL...
1033 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
SQL Sever迁移PG经验
立即下载
ORACLE 10g 数据库体系结构图
立即下载
用SQL做数据分析
立即下载