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

经验分享 程序员 微信小程序 职场和发展