注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

放飞自由

年轻人,如果三年的时间里,没有任何想法,他这一生,就基本这个样子,没有多大改变。

 
 
 

日志

 
 

Oracle迁移MySQL实战总结  

2011-08-26 23:59:56|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近系统要将Oracle迁移到MySQL数据库上,由于需求的需要,Oracle版本的SQL好要留着,这就意味着要在DAO中添加判断。下面罗列了些遇到些的问题,Oracle和Mysql中都支持自定义函数,其实在Oracle和MySQL互相转换的时候我们可以充分的利用自定义函数。这里有Oracle自定函数MySQL自定义函数的例子,只做简单的记录。
1. mysql 要求为每个子查询添加别名 [code lang="sql"] mysql< select count(*) from (select * from user_info) ; ERROR 1248 : Every derived table must have its own alias mysql< select count(*) from (select * from user_info) t; +----------+ | count(*) | +----------+ | 15 | +----------+ 1 row in set SQL< select count(*) from (select * from im_user_info) ; COUNT(*) ---------- 779 [/code] 2. nvl -- > ifNull [code lang="sql"] Oracle : select nvl(null,0) from dual; Mysql : select ifNull(null,0) ; --但这里考虑到要两个版本的公用改用:COALESCE(null,0) Oracle : select COALESCE(null,0) from dual; Mysql : select COALESCE(null,0) ; [/code] 3. 时间 [code lang="sql"] a) to_char --< date_format 例如:to_char(t1.begin_time,'YYYY-MM-DD HH24:MI:SS') as begin_time 转换为: date_format(t1.begin_time,'%Y-%m-%d %H:%i:%s') as begin_time b) to_number --< cast 例如:to_number(operator_code) --< cast(operator_code as unsigned int) c) sysdate --< now() sql< select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; mysql< select date_format(now(),'%Y-%m-%d %H:%i:%s'); d) to_date --< date_format SQL< select to_date('2011-08-01','YYYY-MM-DD') from dual; TO_DATE('2011-08-01','YYYY-MM- ------------------------------ 2011-8-1 mysql< select date_format('2011-08-01','%Y-%m-%d'); +--------------------------------------+ | date_format('2011-08-01','%Y-%m-%d') | +--------------------------------------+ | 2011-08-01 | +--------------------------------------+ 1 row in set mysql< select str_to_date('2011-10-11', '%Y-%m-%d'); +---------------------------------------+ | str_to_date('2011-10-11', '%Y-%m-%d') | +---------------------------------------+ | 2011-10-11 | +---------------------------------------+ 1 row in set e) 增加一个月 mysql< select date_add('2011-01-01',interval 3 month) newdate; +------------+ | newdate | +------------+ | 2011-04-01 | +------------+ SQL< select to_char(add_months(to_date('20110101','yyyymmdd'),3),'yyyy-mm-dd') newdate from dual; NEWDATE ---------- 2011-04-01 [/code] 4. 截取字符串 [code lang="sql"] mysql< select substring('abcdefg',2,3); +--------------------------+ | substring('abcdefg',2,3) | +--------------------------+ | bcd | +--------------------------+ 1 row in set SQL< select substr('abcdefg',2,3) from dual; SUBSTR('ABCDEFG',2,3) --------------------- bcd [/code] 5. 自增列 [code lang="sql"] Oracle使用序列sequence配合触发器实现自增字段,但是MySQL不提供序列,而直接提供字段自增属性,这个字段必须是主键(key)并且不能有默认值。 [/code] 6. 触发器 [code lang="sql"] a) Oracle的自治事务autonomous_transaction,MySQL不支持,您必须用其他方式实现,MySQL不允许在触发器过程中执行对触发器所在表的操作(包括读写) b) MySQL函数和trigger中不能执行动态SQL语句,也就是说,您不能在触发器里面组合出来一个SQL字符串,然后用exec来执行 c) Oracle的表级触发器,MySQL还不支持,所以必须改成使用行级触发器,注意这会导致有时SQL语句的执行效率很低 [/code] 7. 存储过程 [code lang="sql"] a) 格式不同,例如: Oracle为: CREATE OR REPLACE procedure procedure1(TableName in varchar2) is MySQL应该为: CREATE procedure procedure1( in TableName varchar(200)) b) 赋值语句不同: Oracle赋值语句为: strSQL := ‘update table set field1=1’; MySQL应该为: Set StrSQL = ‘update table set field1=1’;(用:=也行) c) 一些要用到游标的过程请注意 MySQL过程不支持嵌套游标,不支持带参游标,不支持记录类型%ROWTYPE,不支持数组等,原Oracle用到这些的必须改写 [/code]
  评论这张
 
阅读(182)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017