orcale 与mysql 数据库转换需要注意的地方

函数months_between()MySql自定义同名函数实现使用Oracle已有函数,MySql自定义同名函数实现 
函数add_months()MySql自定义同名函数实现使用Oracle已有函数,MySql自定义同名函数实现 
函数to_char(date,format)date_format/ time_formatMySql自定义同名函数实现使用Oracle已有函数,MySql自定义同名函数实现 
函数to_char(number)统一成标准格式实现改造为TRIM(CAST(value as char(20)))格式Oracle:to_char(field)
改造为:trim(cast(field as char(20)) )
函数to_date(str)str_to_date(str,format)统一成标准格式实现改造为to_date(str,format)格式Oracle:to_date(b.missionprop4)
改造为:to_date(b.missionprop4,'yyyy-mm-dd') 
函数to_date(str,format)str_to_date(str,format)MySql自定义同名函数实现使用Oracle已有函数,MySql自定义同名函数实现 
关键字date'str'不支持统一成标准格式实现改造为to_date(str,format)格式Oracle :date'2016-01-01'
改造为:to_date('2016-01-01','yyyy-mm-dd') 
函数to_number()CAST("123" AS SIGNED INTEGER)MySql自定义同名函数实现使用Oracle已有函数,MySql自定义同名函数实现 
函数nvl()IFNULL(u.email_address, 10)

ISNULL(u.email_address)
统一成标准格式实现使用case语句代替(为保持通用性,不可使用mysql的ifnull函数)。Oracle:select nvl(sum(prem),0) from ljtempfee_lmriskapp
改造为:select (case when sum(prem) is not null then sum(prem)  else 0 end)  from ljtempfee_lmriskapp;
函数nvl2()统一成标准格式实现使用case语句代替Oracle:select last_name, salary, nvl2(commission_pct, salary + (salary *       commission_pct), salary) income from employees
改造为:select last_name, salary,(case when commission_pct is not  null then salary + (salary *       commission_pct) else salary end) income from employees 
函数decode()统一成标准格式实现使用case语句代替Oracle:select decode(count(prtno),0,'0','1') from laagentascription
改造为:select (case count(prtno) when 0 then '0' else '1' end)from laagentascription 
关键字sysdate不支持Oracle自定义同名函数实现使用MySql已有函数:now()代替直接将sysdate替换为now()
函数instr(str,substr,position,[occurrence])instr(str,substr)/locate(substr,str)MySql自定义同名函数实现自定义函数实现,封装instr4(str,substr,position,occurrence),Oracle有instr4函数,同instr(str,substr,position,[occurrence])将instr替换为instr4,参数不够4个需要补齐(1),请注意如果是两个参数的instr(str,substr)则不替换。
函数length()char_length(),MySql也有length(),其用法同Oracle的lengthb(),是查看字节数。Oracle自定义同名函数实现使用MySql已有函数:char_length()代替直接将length替换为char_length
函数trunc(number)cast(-1.002 as SIGNED)MySql自定义同名函数实现使用Oracle已有函数,MySql自定义同名函数实现 
函数trunc(number,decimalplaces)程序中未发现使用  
函数trunc(date)可使用date_format/ time_format与STR_TO_DATE(str,format)配合实现MySql、Oracle自定义同名函数实现自定义函数实现,封装trunc_date(date)Oracle:select trunc(enddate) from lastatsegment
改造为:select trunc_date(enddate) from lastatsegment
函数trunc(date,'yyyy')可使用date_format/ time_format与STR_TO_DATE(str,format)配合实现MySql、Oracle自定义同名函数实现自定义函数实现,封装trunc_date2(date,str)Oracle:select trunc(enddate,'yyyy') from lastatsegment
改造为:select trunc_date2(enddate,'yyyy') from lastatsegment
函数next_day()程序中未发现使用使用Oracle已有函数,MySql自定义同名函数实现 
写法sum(count())不支持程序中未发现使用需要根据逻辑改写sql,将count()放入子查询中先查询出count值,再在外层查询sum值。例如(请注意增加别名,本例中为aa):
select sum(cnt) from (select count(*) cnt from a) aa
关键字rownum select 中不支持使用分支各自实现按照数据库拆分分支:Oracle使用rownum,MySql使用自定义变量在java中使用if(SysConst.DBTYPE.equals(SysConst.DBTYPE_ORACLE)){……}else if(SysConst.DBTYPE.equals(SysConst.DBTYPE_MYSQL)){……}方式进行改造。改造样例:
Oracle:select  rownum,  A, B,  C from  table1
MySql:select (@rownum := @rownum + 1) AS rownum, A,B,C from (select @rownum:= 0,A, B,  C from  table1 ) t
关键字rownum  where 后limit使用分支各自实现按照数据库拆分分支:Oracle使用rownum,MySql使用limit在java中使用if(SysConst.DBTYPE.equals(SysConst.DBTYPE_ORACLE)){……}else if(SysConst.DBTYPE.equals(SysConst.DBTYPE_MYSQL)){……}方式进行改造。Oracle使用rownum,MySql使用limit
关键字||不支持,可使用concat()函数拼接字符串,MySql中concat可支持n个参数,但是Oracle中只支持2个参数统一成标准格式实现统一使用concat('参数1','参数2')两个参数的形式进行改造concat只使用两个参数,改造样例如下:
Oracle:select 'a'||'b'||'c'||'d' from dual
改造为:select concat(concat(concat('a','b'),'c'),'d') from dual
关键字(+)不支持统一成标准格式实现使用left join/right join方式进行改造需要分析SQL逻辑,样例:
Oracle:
SELECT a.name,b.Region,C.Language
FROM
 city a,country b ,countrylanguage C
WHERE
 a.CountryCode=b.Code(+) AND
 a.CountryCode = C.CountryCode(+) AND
 a.ID = 1;
改造为:
SELECT a.name,b.Region,C.Language
FROM
 city a
  LEFT JOIN country b
  ON a.CountryCode=b.Code
   LEFT JOIN countrylanguage C
   ON a.CountryCode =C.CountryCode
WHERE
 a.ID = 1; 
写法日期相减:date1- date2不支持Oracle自定义同名函数实现使用MySql已有函数:datediff()代替Oracle:select date1- date2 from dual
改造为:select  datediff(date1,date2) from dual
写法日期:date+number不支持Oracle自定义同名函数实现使用MySql已有函数:adddate()代替Oracle:select date+1 from dual
改造为:select  adddate(date,1) from dual
写法日期:date-number不支持Oracle自定义同名函数实现使用MySql已有函数:subdate()代替Oracle:select date-1 from dual
改造为:select  subdate(date,1) from dual
关键字start with … connect by prior …不支持使用分支各自实现按照数据库拆分分支:重新设计改造样例无,需要根据逻辑进行修改,先标记位置标记
关键字with … as …不支持使用分支各自实现按照数据库拆分分支:重新设计改造样例无,需要根据逻辑进行修改,先标记位置标记
开窗函数over窗口函数(分析函数):
sum() over(partition by order by)、
row_number() over(partition by order by)、
dense_rank () over(partition by order by)、
rank () over(partition by order by)
不支持使用分支各自实现按照数据库拆分分支:重新设计,使用用户变量来支持MySql改造样例无,需要根据逻辑进行修改,先标记位置标记
字典表user_字典表对应字典表information_schema.字典表使用分支各自实现按照数据库拆分分支:Oracle使用user_[表],MySql使用information_schema.[表]。在java中使用if(SysConst.DBTYPE.equals(SysConst.DBTYPE_ORACLE)){……}else if(SysConst.DBTYPE.equals(SysConst.DBTYPE_MYSQL)){……}方式进行改造。
对照Oracle数据库及MySql数据库寻找想对应的表及字段进行改造。
系统函数获取当前数据库登录用户名:SYS_CONTEXT('USERENV','CURRENT_USER')MySql中的USER()相当于Oracle中SYS_CONTEXT('USERENV','CURRENT_USER')||'@'||SYS_CONTEXT('USERENV','IP_ADDRESS');需要注意的是如果IP是本地,执行结果为:
MySql:root@localhost
Oracle:LIS6@127.0.0.1
使用分支各自实现按照数据库拆分分支:Oracle使用SYS_CONTEXT('USERENV','CURRENT_USER'),MySql使用USER()加工在java中使用if(SysConst.DBTYPE.equals(SysConst.DBTYPE_ORACLE)){……}else if(SysConst.DBTYPE.equals(SysConst.DBTYPE_MYSQL)){……}方式进行改造。
获取当前登录的用户名,Oracle使用:select SYS_CONTEXT('USERENV','CURRENT_USER') from dual
MySql使用:select SUBSTRING(USER(),1,INSTR(USER(),'@')-1) from dual
关键字order by column nulls last( nulls first)
 
不支持统一成标准格式实现使用case语句做一个伪列进行处理,order by  (case when column is null then 0 else 1 end) ,columnOracle : select * from lccont  order by familytype,familyid desc  nulls first
改造为:select * from lccont order by familytype, (case when familyid is null then 0 else 1 end),familyid desc
Oracle : select * from lccont  order by familytype,familyid desc  nulls last
改造为:select * from lccont order by familytype, (case when familyid is null then 1 else 0 end),familyid desc
系统函数dbms_metadata.get_ddl()不支持使用分支各自实现按照数据库拆分分支:重新设计,使用show create table tab加工来支持MySql改造样例无,需要根据逻辑进行修改,先标记位置标记
写法select 1 from dualselect 1 程序中未发现使用MySql 支持dual,只是不支持select * from dual,将*根据情况做替换 
写法from子查询:select * from (select * from ldsysvar);from子查询必须有别名统一成标准格式实现为select 的 from中子查询增加别名为select 的 from中子查询增加别名,别名请结合sql情况起名。例如:
Oracle:select * from (select * from ldsysvar);
改造为:select * from (select * from ldsysvar) a;
写法Insert/Delete语句为表指定了别名:
delete from table_name a;
insert into table_name a ……
insert /delete 操作是不允许使用表别名的。统一成标准格式实现分析sql去掉别名,直接使用表名Oracle:delete from table_name a where a.name = 'a'
改造为:delete from table_name where table_name.name = 'a'
写法Delete/Update的Where条件的子查询中包括自己:update test set id=1 where pid in(select id from test where pid=12)delete/update  where条件中不允许自连接使用分支各自实现按照数据库拆分分支:重新设计改造样例无,需要根据逻辑进行修改,先标记位置标记
写法oracle索引强制提示:(select /*+index(lcpol,PK_LCPOL)*/不支持使用分支各自实现按照数据库拆分分支,Oracle保留索引不做修改,MySql直接删除索引强制提示在java中使用if(SysConst.DBTYPE.equals(SysConst.DBTYPE_ORACLE)){……}else if(SysConst.DBTYPE.equals(SysConst.DBTYPE_MYSQL)){……}方式进行改造。Oracle保留索引,MySql直接删除索引强制提示
函数empty_blob()不支持使用分支各自实现Oracle使用empty_blob()插入空,MySql使用null(未亲自验证),本来想分开写个分支就可以了,但是看程序发现,系统对Oracle的blob字段操作进行了封装:COracleBlob.java,MySql 是否要自己封装一个处理类??? 标记
函数translate(str,fstr,rstr)不支持MySql自定义同名函数实现使用Oracle已有函数,MySql自定义同名函数实现 
函数regexp_replace()不支持,MySql正则使用regexp使用分支各自实现①、如果regexp_replace()第二个参数不是正则表达式,可以直接使用replace()替换则直接进行替换即可,不必使用分支实现。②、如果第二个参数为正则表达式,则需要根据此函数的使用位置重新改写SQL逻辑实现,此种情况使用分支各自实现。①、Oracle:select regexp_replace(a, b, c) from dual;
改造为:select replace(a, b, c) from dual;
②、在java中使用if(SysConst.DBTYPE.equals(SysConst.DBTYPE_ORACLE)){……}else if(SysConst.DBTYPE.equals(SysConst.DBTYPE_MYSQL)){……}方式进行改造。
函数regexp_like()不支持,MySql正则使用regexp使用分支各自实现按照数据库拆分分支:Oracle使用[NOT] REGEXP_LIKE(field, '正则');,MySql使用field  [NOT]  REGEXP  '正则'。Oracle:select * from lbpoedorinvestlist where  REGEXP_LIKE(investrate, '^([0-9]+)(.[0-9]+){0,1}$');
改造为:select * from lbpoedorinvestlist where investrate  REGEXP  '^([0-9]+)(.[0-9]+){0,1}$'
关键字case when then else end  casecase when then else end统一成标准格式实现Oracle case when中的end 后可以有case也可以没有case。但是MySql 中end后不能有case。如果遇到end case,去掉end 后的case。Oracle:select case a when '1' then b else c end case from table;
改造为:select case a when '1' then b else c end  from table;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值