Mysql语句转Oracle语句报错总结

最近在做项目迁移,Mysql版本的迁到Oracle版本,遇到有些oracle的函数,mysql并没有,所以就只好想自定义函数或者找到替换函数的方法进行改造。

所以本博客主要介绍Mysql兼容Oracle改造方式以及注意事项,也就是介绍原本Oracle一些函数在Mysql的替换方法等等,适合给原本是Oracle版本的项目,想兼容Mysql版本。

(1) 模糊匹配

Oracle的模糊匹配和mysql是不同的,在mybatis项目里,用Oracle,我们可能会这样写:where a like '%'|| #{参数} ||'%',不过放在mysql就不兼容了,mysql的做法是这样的where a like concat('%', #{参数} ,'%')

(2) 删除数据

一个小细节,在Oracle里删除数据,delete 表格 t where t.id = '?' 或者 delete from 表格 t where t.id = '?' 不加关键字from或者用和不用别名t都是可以的,不过放在mysql5.X就不可以了,其它Mysql版本没验证过,Mysql版本要求必须加关键字from同时不能加别名 delete from 表格 where id = '?'

(3) 时间函数

Oracle的时间函数和Mysql的时间函数是不同的,Oracle的格式是to_date('2019-02-12 14:20:22', 'yyyy-mm-dd hh24:mi:ss'),Mysql的格式是str_to_date('2019-02-12 11:34:32', '%Y-%m-%d %H:%i:%s')

(4) 关键字问题

在Oracle还是mysql建表的时候,一般都不要用数据库关键字做表的字段,比如Order,CONDITION等等,特别是mysql就直接报错。假如用CONDITION做表字段,在写入数据的时候就要用CONDITION,加“`”符号,

(5) 排序问题

oracle做数据排序的时候,有时候可以用nulls first或者nulls last将null值排在最前或者最后。
不过迁到Mysql的话,mysql并没有提供类似函数,所以要怎么实现?下面给出解决方法:
null值排在最后,用Mysql的IF和ISNULL函数。如果为空返回1,否返回0

 

Orcle 一些常见报错解决方向:

1.批量新增,在mybatis 文件中 mysql批量新增与orcle 批量新增不一样 , 去除values  ,将separator = “,”改成 separator="union all" ,同时将<foreache>标签中参数用虚拟表dual查询出来
 <foreach collection="list" item="item" index="index" separator="union all">
           (SELECT
           
           FROM DUAL
           )

2.批量修改,将separator = “,”改成 如下
<foreach collection="list" item="item" index="index" separator=";" open="begin" close=";end;">


3.ORA-01861: 文字与格式字符串不匹配(大概率是时间问题)

时间转换 :
AND sales_time &gt;=TO_DATE(#{beginDate},'yyyy-MM-dd')
AND sales_time &lt;=TO_DATE(#{endDate},'yyyy-MM-dd')

类型转换:
to_char()


4:ORA-00920: 无效的关系运算符
模糊搜索
AND (instr( client.client_name, 'A' ) >0
    OR instr( info.hy_name, 'A' ) >0 ) 
AND instr( detail.item_name, 'A') >0

5: ORA-00918: 未明确定义列
查询出来有两个或者多个相同的列,Oracle MyBatis 它不知道怎么办(resultType),所以就报这个异常。

6: ORA-00904: "3": 标识符无效
需要改成单引号,oracle不识别""

7:ORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB
加to_char进行转换,mybatis结果集解析的类型与表中类型不一致,大部分是时间格式等类型问题

8:日期函数加减  注意函数关键字
AND a.operate_time >= to_date('2020-10-01','yyyy-MM-dd') 
    AND a.operate_time < to_date( '2020-10-21', 'yyyy-MM-dd' )+INTERVAL '1' DAY 

9: ORA-01476: 除数为 0
decode(b,0,null,a/b) 这样如果b为0,输出null,不为0输出a/b 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值