ob和mysql兼容吗_目前实际开发中,我遇到的mysql和oracle数据不兼容问题

1.出现SVN提交冲突问题

如若出现提交问题,是指不同的人在改同一个页面,他在你之前提交,所以你会出现提交失败,再提交会提交成功

如果他把你修改的页面的某一栏删除了,那么你在该栏上定义的方法会默认到下一行,

2,如果你更新代码后服务器启动不了

出现无法启动问题,且js文件有很多,这是出现了文件冲突问题,更新之前会有提示框提醒,会出现三个页面,你自己的vertion在左边和别人的vertion在右边,你只需要 两者中和就行,去掉多余的,如果不会改,就用之前你能 打开的\

3.关于部分sql优化问题

1. union和union all的问题,sql兼容性很大,oracle则要考虑,

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。(即sql语句)

Union All:对两个结果集进行并集操作,包括重复行,不进行排序。(至于如何使用,试情况而定)

2.group by问题

多数情况下,你需要在最开始查询的地方,进行distinct过滤操作,且要把你需要查询的字段全部展示出来,而在sql里面则没有这么严格,本条是sql和oracle全部兼容的 情况,group by 在这两者中的查询顺序不一样

3.select *问题

大范围查询,不能轻易使用,oracle则要求更细,最好写全字段

4.year和now问题

oracle里面没有year和now()字段,year可以用to_char代替,如果实在要用now,可以写一个拦截器

类似于这样 TO_CHAR(NOW(),'YYYY-MM-DD')

/**

* SYSDATE替换NOW()处理器

* @author xiu.fu

* @date 2019/7/2 0002 下午 1:37

*/

@Component

public class Now2SysdateHandler extends BaseORACLEHandler {

@Override

public void doHandler(SQLModel model) {

// 获取SQL语句

String sql = model.getSql();

if (StringUtils.isNotBlank(sql)) {

sql = sql.replaceAll("now\\(\\)", "NOW()");

// 判断SQL中是否有NOW关键字

if (sql.indexOf("NOW()") > -1) {

// 执行替换

sql = sql.replaceAll("NOW\\(\\)", "SYSDATE");

// 替换完成后从新装入SQL

model.setSql(sql);

}

// 判断是否有下一个处理器

if (this.hasNext()) {

// 调用下一个处理器执行

this.getNextHandler().doHandler(model);

}

}

}

@PostConstruct

@Override

public void init() {

}

@PreDestroy

@Override

public void destroy() {

}

}

5.concat的作用是拼接两个字符串,它最多只能拼接两个字符串,想要拼接多个,可以写拦截器

/**

* 处理函数:CONCAT(param1, param2, param3) .

*

* @date 2019/6/27 15:31

*/

@Component

public class ConcatHandler extends BaseORACLEHandler {

/**

* CONCAT函数解析器

*/

private static final Pattern PATTERN = Pattern.compile("CONCAT\\(([^\\(\\)]*?),([^\\(\\)]*?),([^\\(\\)]*?)\\)");

@Override

public void doHandler(SQLModel model) {

// 获取SQL语句

String sql = model.getSql();

if (StringUtils.isNotBlank(sql)) {

sql = sql.replaceAll("concat\\(", "CONCAT(");

// 判断SQL中是否有CONCAT关键字

if (sql.indexOf("CONCAT(") > -1) {

if (PATTERN.matcher(sql).find()) {

List sqlArrList = getMatcher(PATTERN, sql);

for (String[] sqlArr : sqlArrList) {

final String concatSql = sqlArr[0];

final String param1 = sqlArr[1];

final String param2 = sqlArr[2];

final String param3 = sqlArr[3];

String newConcatSql = String.format("CONCAT(CONCAT(%s,%s),%s)", param1, param2, param3);

sql = sql.replace(concatSql, newConcatSql);

}

}

// 替换完成后从新装入SQL

model.setSql(sql);

}

// 判断是否有下一个处理器

if (this.hasNext()) {

// 调用下一个处理器执行

this.getNextHandler().doHandler(model);

}

}

}

/**

* 获取匹配的SQL语句及参数信息

* @param pattern

* @param source

* @return

*/

public List getMatcher(Pattern pattern, String source) {

List result = new ArrayList<>();

Matcher matcher = pattern.matcher(source);

while (matcher.find()) {

String sql = matcher.group(0);

String param1 = matcher.group(1);

String param2 = matcher.group(2);

String param3 = matcher.group(3);

String[] arr = new String[] { sql, param1, param2, param3 };

result.add(arr);

}

return result;

}

@PostConstruct

@Override

public void init() {

}

@PreDestroy

@Override

public void destroy() {

}

}

6.oracle里面没有datediff字段,可以写拦截器,用ceil代替

/**

* 处理函数datadiff

*

* @param

* @author xiu.fu

* @return

* @date 2019/7/2 0002 下午 1:37

*/

@Component

public class Datediff2CeilHandler extends BaseORACLEHandler {

public static final Pattern pattern = Pattern.compile("DATEDIFF\\(\\S+,");

@Override

public void doHandler(SQLModel model) {

// 获取SQL语句

String sql = model.getSql();

Matcher matcher;

if (StringUtils.isNotBlank(sql)) {

sql = sql.replaceAll("datediff", "DATEDIFF");

// 判断SQL中是否有DATEDIFF关键字

if (sql.indexOf("DATEDIFF") > -1) {

matcher = pattern.matcher(sql);

while (matcher.find()) {

String exp = matcher.group();

exp = exp.replaceFirst(GlobalConstants.Symbol.COMMA, GlobalConstants.Symbol.MINUS).replaceAll("DATEDIFF", "CEIL");

sql = matcher.replaceFirst(exp);

matcher = pattern.matcher(sql);

}

// 替换完成后从新装入SQL

model.setSql(sql);

}

// 判断是否有下一个处理器

if (this.hasNext()) {

// 调用下一个处理器执行

this.getNextHandler().doHandler(model);

}

}

}

@PostConstruct

@Override

public void init() {

}

@PreDestroy

@Override

public void destroy() {

}

}

7.localdate和localDateTime问题,两者作为查询条件时,localDateTime会有时分秒的误差,典型的会出现,区间内的 时间可以查询出来,当前区间的会查不出来,解决方 法是修改To_char使之兼容

localDate 条件举例

AND TO_DATE(TO_CHAR(apl.LOAN_DATE,'yyyy-MM-dd'), 'yyyy-MM-dd') >={loanDateStart}

AND TO_DATE(TO_CHAR(apl.LOAN_DATE,'yyyy-MM-dd'), 'yyyy-MM-dd') <= #{loanDateEnd}

localDateTime 条件举例

= TO_CHAR(#{applyDateTimeStart},'YYYY-MM-DD') ]]>

8.group_concat连接的字符串,前面查询要用to_char().

/**

* GROUP_CONCAT函数处理器 .

*

* @date 2018/7/12 9:30

*

* [1.1] 2019/12/23 david.cui 增加Oracle乱码的转换处理

*

*/

@Component

public class GroupConcatHandler extends BaseORACLEHandler {

//[1.1]

public static final String regex = "GROUP_CONCAT\\(([^()]*\\(?[^()]*\\)?\\s*)\\)";

@Override

public void doHandler(SQLModel model) {

// 获取SQL语句

String sql = model.getSql();

if (StringUtils.isNotBlank(sql)) {

sql = sql.replaceAll("group_concat", "GROUP_CONCAT");

// 判断SQL中是否有GROUP_CONCAT关键字

if (sql.indexOf("GROUP_CONCAT") > -1) {

//[1.1]

Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(sql);

while (matcher.find()) {

// 转换后的函数

String matchParm = matcher.group(1); //()

String allMatchParm = matcher.group(0); //ALL

String tempMatchParm = allMatchParm.replace(matchParm, "TO_CHAR("+matchParm+")"); //GROUP_CONCAT括号里面的内容加TO_CHAR

sql = sql.replace(allMatchParm, "TO_CHAR("+tempMatchParm+")"); //GROUP_CONCAT括号外面的内容加TO_CHAR

}

// 执行替换

sql = sql.replaceAll("GROUP_CONCAT\\(", "WM_CONCAT(");

// 替换完成后从新装入SQL

model.setSql(sql);

}

// 判断是否有下一个处理器

if (this.hasNext()) {

// 调用下一个处理器执行

this.getNextHandler().doHandler(model);

}

}

}

@PostConstruct

@Override

public void init() {

}

@PreDestroy

@Override

public void destroy() {

}

}

9.!='',oracle不能用这个!=,加个转换COALESCE(字段,'') <>'',COALESCE后面字段要加varchar,如果字段类型是Nvarchar,就要转化,COALESCE(to_char(字段) ,'') <>''

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值