数据从MySQL迁移到Oracle 需要注意什么

数据从MySQL迁移到Oracle 需要注意什么,第1张

1.自动增长的数据类型处理

MYSQL有自动增长的数据类型,插入记录时不用 *** 作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE

其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999

INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL

2. 单引号的处理

MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

3. 翻页的SQL语句的处理

MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位 置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。

以下是经过分析后较好的两种ORACLE翻页SQL语句( ID是唯一关键字的字段名 ):语句一:SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW >80 AND NUMROW <100 ) ORDER BY 条件3语句二:SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW >80 AND NUMROW <100 ) ORDER BY 条件3

4. 长字符串的处理

长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可 *** 作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长 度字段值都应该提出警告,返回上次 *** 作。

5. 日期字段的处理

MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE, 精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日 24小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用 DATE_FIELD_NAME >SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7

6. 空字符的处理

MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

7. 字符串的模糊比较

MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果。

8. 程序和函数里, *** 作数据库的工作完成后请注意结果集和指针的释放。

可以用PB、PLSQL Developer等软件,把表的数据倒成SQL文件,在MySql中执行!

PLSQL Developer下载: http://www.oyksoft.com/downinfo/1924.html

我们项目组曾经将Oracle的数据倒入到DB2中,没有DBA,没有用到任何工具,是写数据迁移程序,大概步骤是这样:

1、根据双方数据库的数据字典,罗列出需要的字段

2、编写相应的迁移程序,主要注意的地方就是Oracle的数据类型要做相应的转换,转移成DB2里有的,删除倒出时一些无用的数据,使导入的数据具有意义!

3、抽取数据做验证!

你参考一下,如果数据量不大的话,完成可以用把表的数据倒成SQL文件再执行!

将mysql中的表结构导出放入oracle中的方法:

1、导出mysql的表结构sql脚本,然后修改mysql中的数据类型为oracle中的数据类型:

MySql与Oracle数据类型的相互转化如下:

2、mysql的建表SQL:

CREATE TABLE `apiindicator` (

`id` int(11) NOT NULL,

`apiid` int(11) DEFAULT NULL COMMENT '关联api信息表(apiinfo)id',

`cnname` varchar(100) DEFAULT NULL COMMENT '指标中文名',

`enname` varchar(60) DEFAULT NULL COMMENT '指标英文名 ',

`description` varchar(1000) DEFAULT NULL,

`datatype` varchar(15) DEFAULT NULL, `isout` bit DEFAULT '1' COMMENT  '是否必须输出 ,默认为输出;0:不输出 1:输出',

`state` int(11) DEFAULT '0',

`isdelete` bit DEFAULT '0' COMMENT '删除标记:0未删除;1已删除',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Api指标表 '

转化后是:

CREATE TABLE apiindicator (

id integer NOT NULL,

apiid integer DEFAULT NULL COMMENT '关联api信息表(apiinfo)id',

cnname varchar2(100) DEFAULT NULL COMMENT '指标中文名',

enname varchar2(60) DEFAULT NULL COMMENT '指标英文名 ',

description varchar2(1000) DEFAULT NULL,

datatype varchar2(15) DEFAULT NULL, isout bit DEFAULT '1' COMMENT  '是否必须输出 ,默认为输出;0:不输出 1:输出',

state integer DEFAULT '0',

isdelete char(1) DEFAULT '0' COMMENT '删除标记:0-未删除;1-已删除'

)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7250558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存