有一些没有使用数据库中间件的软件可能会碰到在不同的应用场景需要用不同的数据库,这样可能就需要将数据库代码做移植,我这里整理了一些从oracle到mysql的移植过程中的注意事项:
1、sequence生成
可以用类似的东西来做,如下:
create table myseq ( seq varchar(8));
insert into myseq values('0');
update myseq set seq = last_insert_id(seq+1);
select last_insert_id();
这东西完全跟oracle的sequence一致。即使在update之后,select之前有其它session也update了,本session得到的,仍然是自己update的那一个值。
2、sysdate转为sysdate()
3、substr装换,基本不需要转换
4、nvl转换为ifnull
5、数字转换为字符串的to_char函数不用,直接用即可,不用函数转换
6、日期格式的to_char转换为date_format
oracle: to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
mysql: select date_format(now(),'%Y-%m-%d %H-%i-%S')
7、to_date()装换,删除转换,mysql支持自动转换
8、decode()转换,
case when flag=0 then '成功' else '失败' end
9、rownum转换,分页转换
querySql = "select * from ( select rownum rnm, a.* from ( " + strQuery
// + ") a where rownum <= " + getPageEndRow()
//+ ") where rnm > " + getPageStartRow();
转换为:
querySql = "select * from ( select 1 rnm, page_a.* from ( " + strQuery
+ ") page_a LIMIT " + getPageStartRow() + "," + getPageSize() + " ) select_page";
10、from子查询转换,为子查询定义别名
select count(*) from (
select a.login_no,a.LOGIN_NAME,a.EXPIRE_TIME,b.orgname,a.CONTRACT_PHONE,a.info_flag,a.login_level,a.group_id from DLOGINMSG a left outer join dchngroupinfo b on a.group_id=b.orgno where 1=1 and a.login_no like '%test%'
) subselect ......