函数 | months_between() | 无 | MySql自定义同名函数实现 | 使用Oracle已有函数,MySql自定义同名函数实现 | 否 | |
函数 | add_months() | 无 | MySql自定义同名函数实现 | 使用Oracle已有函数,MySql自定义同名函数实现 | 否 | |
函数 | to_char(date,format) | date_format/ time_format | MySql自定义同名函数实现 | 使用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) ,column | Oracle : 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 dual | select 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 case | case 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; | 是 |
orcale 与mysql 数据库转换需要注意的地方
最新推荐文章于 2023-11-01 10:02:12 发布