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(字段) ,'') <>''