Oraclemysql差异性总结

之前有个项目是用oracle数据库进行开发,需要把数据库改成mysql,遇到了一些地方需要注意的,就简单记了下来。

备注:

再把oracle转成mysql的时候,表中字段的类型转换是比较头疼的,比如oracle中的number转成mysql的时候,你要从“FLOATDOUBLETINYINT SMALLINTMEDIUMINTINTBIGINT”中选择一个合适的,其他数据类型同理;工具转的话经常就会把你带进坑里了。。坑爹,一不小心就报错了,这个错误排查起来还比较麻烦,只有细心应对。

 

一、

WM_CONCAT对应GROUP_CONCAT;

二、

ronum可用limit代替;

三、

sys_guid()用uuid()代替

四、

add_months(t2.maxTime,-12)用date_add(t2.maxTime,interval -12 month)代替;

date_format(date,'%Y-%m-%d')-->oracle中的to_char();

str_to_date(date,'%Y-%m-%d')-->oracle中的to_date();

%Y:代表4位的年份

%y:代表2为的年份

%m:代表月, 格式为(01……12)

%c:代表月, 格式为(1……12)

%d:代表月份中的天数,格式为(00……31)

%e:代表月份中的天数, 格式为(0……31)

%H:代表小时,格式为(00……23)

%k:代表 小时,格式为(0……23)

%h: 代表小时,格式为(01……12)

%I: 代表小时,格式为(01……12)

%l :代表小时,格式为(1……12)

%i: 代表分钟, 格式为(00……59)

%r:代表 时间,格式为12 小时(hh:mm:ss [AP]M)

%T:代表 时间,格式为24 小时(hh:mm:ss)

%S:代表 秒,格式为(00……59)

%s:代表 秒,格式为(00……59)

例子:

select case when add_months(t2.maxTime,-12)>t1.minTime then to_char(add_months(t2.maxTime,-12),'yyyy-MM') else to_char(t1.minTime,'yyyy-MM') end as startTime,to_char(t2.maxTime,'yyyy-MM') as endTime from(select min(t.log_time) as minTime from t_lm_operlog t) t1,(select max(t.log_time) as maxTime from t_lm_operlog t)t2

转为:

select case when date_add(t2.maxTime,interval -12 month)>t1.minTime then date_format(date_add(t2.maxTime,interval -12 month),'%Y-%m') else date_format(t1.minTime,'%Y-%m') end as startTime,date_format(t2.maxTime,'%Y-%m') as endTime from(select min(t.log_time) as minTime from t_lm_operlog t) t1,(select max(t.log_time) as maxTime from t_lm_operlog t)t2

五、

oracle中:to_char(number)把number转成varchar2,在mysql中用concat(number)

六、

oracle中:to_number在mysql中可以用cast或者convert

七、

Oracle中记录行号用Rownum RN;

在mysql中:Select UID,(@rowNum:=@rowNum+1) as rowNo From a,(Select (@rowNum :=0) ) b Order by a.Money Desc;

八、

SmRappfucauthEntityMapper.xml中的insert:merge into

九、

在mapper.xml中,oracle语法:

AND rolename like '%'||#{rolename}||'%'

Mysql语法:

AND rolename like CONCAT(CONCAT('%',#{rolename ,jdbcType=VARCHAR}),'%')

十、

mysql报错:mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。

例如下面这个sql:

delete from tbl where id in

(

        select max(id) from tbl a where
EXISTS

        (

            select 1
from tbl b where a.tac=b.tac group by tac HAVING count(1)>1

        )

        group by tac

)

改成:

delete from tbl where id
in

(

    select a.id from

    (

        select max(id) id from tbl a where
EXISTS

        (

            select 1
from tbl b where a.tac=b.tac group by tac HAVING count(1)>1

        )

        group by tac

    ) a

)

也就是说将select出的结果再通过中间表select一遍,这样就规避了错误。注意,这个问题只出现于mysql,mssql和oracle不会出现此问题。

十一、

Oracle中:to_date(#{createtime ,jdbcType=VARCHAR },'yyyy-MM-dd
hh24:mi:ss')

Mysql中:

str_to_date(#{createtime
,jdbcType=VARCHAR },'%Y-%m-%d %T')

十二、

Oracle中有递归:start with ...connect by prior;

在mysql中没有写个方法,但可以用函数来实现mysql递归;

例如:

Oracle递归:

select
s.sysfuncid from T_SM_SYSFUNC s where s.sysfuncid!=t.sysfuncid start with
s.sysfuncid = t.sysfuncid connect by prior s.sysfunccode=s.psysfuncid

Mysql递归:

select s.sysfuncid from
T_SM_SYSFUNC s where s.sysfuncid!=t.sysfuncid and
FIND_IN_SET(s.sysfuncid,FOO3(t.sysfuncid))

mysql函数FOO3:

DROP
FUNCTION IF EXISTS FOO3;

CREATE
FUNCTION `FOO3` (userid varchar(255))

RETURNS
VARCHAR(4000)

BEGIN

DECLARE
sTemp VARCHAR(4000);

DECLARE
sTempChd VARCHAR(4000);

SET
sTemp = '$';

SET
sTempChd = areaId;

WHILE
sTempChd is not NULL DO

SET
sTemp = CONCAT(sTemp,',',sTempChd);

SELECT
group_concat(sysfunccode) INTO sTempChd FROM T_SM_SYSFUNC where FIND_IN_SET(psysfuncid,sTempChd)>0;

END
WHILE;

return
sTemp;

END

最新文章

  1. Visual Studio 2008 Package Load Failure:未能正确加载包“Microsoft.VisualStudio.Xaml”
  2. Windows 10 下mysql 安装后无法启动问题
  3. Java在JFinal中出现Can not create instance of class: com.keesail.web.config.WebConfig异常处理方式
  4. OpenGL法向量变换
  5. [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)
  6. 初识Winform , 还好没喜欢上控制台
  7. 【转】 Linux 线程同步的三种方法
  8. 选择结构if语句和switch语句的区别
  9. HTML5 appcache
  10. SharePoint 2010 BCS - 简单实例(一)数据源加入
  11. 实例PK(Vue服务端渲染 VS Vue浏览器端渲染)
  12. Android SDK国内更新
  13. Effective Java 第三版——42.lambda表达式优于匿名类
  14. 在.Net Core WebAPI下给Swagger增加导出离线文档功能
  15. .Net 一开始就不应该搞 .Net Core
  16. 现有n 个乱序数,都大于 1000 ,让取排行榜前十,时间复杂度为o(n), top10, 或者 topK,应用场景榜单Top:10,堆实现Top k
  17. ifream框架角色切换
  18. n个括号对的所有可能情况
  19. JavaScipt测试调研
  20. 87. Scramble String (String; DP)

热门文章

  1. POJ3264 (RMQのST解法)
  2. 2016 湖南省省赛 Problem A: 2016
  3. eclipse中删除多余的tomcat server
  4. grid 布局 CSS3
  5. indexed database IndexedDB
  6. Javascript判断数据类型与真假值隐形转换研究
  7. heapster源码分析——kubelet的api调用分析
  8. 特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)
  9. tomcat不编译webapps下的war包的解决办法
  10. 主机和VMware中的Linux如实现共享文件夹