专栏首页杨建荣的学习笔记通过java来格式化sql语句(r4笔记第61天)

通过java来格式化sql语句(r4笔记第61天)

经常在抓取一些sql语句的时候,得到的sql文本有格式的问题,如果尝试得到执行计划,每次都会费一番周折。 比如下面的sql语句,基本包含了常见的格式问题。第3行,第4行出现了断行,执行的时候就会报错。

select /*+ leading(s) index(s TABLE_BPM_STEP_INST_5IX) use_nl(s p
p step) */ s.ALLOW_CREATE, s.ASSIGNEE, s.ASYNC_RETURNED_PARAMS, s
.ATTACHER2STEP_INST, s.COMMITTER, s.CONTROL_COUNT, s.CURR_FAULT2F
AULT_INFO, s.DO_AVAIL_ON_RESUM, s.DO_FIN_ON_RESUM, s.HAS_DEPENDEN
TS, s.HAS_MARCH_REND, s.HAS_REND, s.INFLOW_BITS, s.ITER_COUNT, s.
NUM_OR_PREREQS, s.NUM_PENDING, s.NUM_PENDING_PREREQS, s.OBJID, s.
OUTFLOW_BITS, s.PARAMS, s.PARENT2PROC_INST, s.ROOT2PROC_INST, s.S
TART_TIME, s.STATUS, s.STATUS_CHANGE_TIME, s.STEP2STEP, s.TARGETE
D_BY_ALARMS, s.TRIGGERS_ALARMS, s.WAIT_TIME, s.WORKER FROM TABLE_
BPM_PROC_INST p, TABLE_BPM_STEP_INST s, TABLE_BPM_STEP step WHERE
 s.root2proc_inst = p.objid AND s.step2step = step.objid AND ( NO
T (step.step_type = 4)) AND p.root_status in (0, 14) AND s.commit
ter = :1 AND s.assignee in ('BpmInServer', 'BpmInServerSmThr', 'B
pmJms') AND s.status in (50, 55) AND s.curr_fault2fault_info is n
ull and ( p.EXEC_DOMAIN like :2 ) 

今天下定决心使用java来格式化了一把sql文本。 格式化后的文本如下,得到的效果还是不错的。

select /*+ leading(s) index(s TABLE_BPM_STEP_INST_5IX) use_nl(s
pp step) */ s.ALLOW_CREATE, s.ASSIGNEE, s.ASYNC_RETURNED_PARAMS,
s.ATTACHER2STEP_INST, s.COMMITTER, s.CONTROL_COUNT,
s.CURR_FAULT2FAULT_INFO, s.DO_AVAIL_ON_RESUM, s.DO_FIN_ON_RESUM,
s.HAS_DEPENDENTS, s.HAS_MARCH_REND, s.HAS_REND, s.INFLOW_BITS, s.ITER_COUNT,
s.NUM_OR_PREREQS, s.NUM_PENDING, s.NUM_PENDING_PREREQS, s.OBJID,
s.OUTFLOW_BITS, s.PARAMS, s.PARENT2PROC_INST, s.ROOT2PROC_INST,
s.START_TIME, s.STATUS, s.STATUS_CHANGE_TIME, s.STEP2STEP,
s.TARGETED_BY_ALARMS, s.TRIGGERS_ALARMS, s.WAIT_TIME, s.WORKER FROM
TABLE_BPM_PROC_INST p, TABLE_BPM_STEP_INST s, TABLE_BPM_STEP step
WHERE s.root2proc_inst = p.objid AND s.step2step = step.objid AND (
NOT (step.step_type = 4)) AND p.root_status in (0, 14) AND
s.committer = :1 AND s.assignee in ('BpmInServer', 'BpmInServerSmThr',
'BpmJms') AND s.status in (50, 55) AND s.curr_fault2fault_info is
null and ( p.EXEC_DOMAIN like :2 )           

对应的java代码结构如下,适当做了重构,可以在稍后把java代码封装一下。

public class FormatSql {
 public static void main(String[] args) throws IOException {

 ArrayList<String> strArr = readFromFile();  //从指定的文件中读取文件内容

        formatSQL(strArr);    //格式化sql文件

        OutputFormatSql(strArr);  //输出格式化后的sql语句

 }

完整的代码如下:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class FormatSql {
public static void main(String[] args) throws IOException {
ArrayList<String> strArr = readFromFile();
formatSQL(strArr);
OutputFormatSql(strArr);
}


private static void formatSQL(ArrayList<String> strArr) {
String tmpCurrLine;
String tmpNextLine;
for (int i = 0; i < strArr.size(); i++) {
tmpCurrLine = strArr.get(i);
// consider last line
if (strArr.size() == (i + 1)) {
tmpNextLine = "";
} else {
tmpNextLine = strArr.get(i + 1);
formatSqlLine(tmpCurrLine, tmpNextLine, strArr, i);
}

}
}


private static void OutputFormatSql(ArrayList<String> strArr) {
for (int i = 0; i < strArr.size(); i++) {
System.out.println(strArr.get(i));
}
}


private static void formatSqlLine(String tmpCurrLine, String tmpNextLine,
ArrayList<String> strArr, int i) {
String tmpCurrFormatLine;
String tmpCurrLeftLine;
for (int j = tmpCurrLine.length() - 1; j > 0;) {
if (tmpCurrLine.charAt(j) == ' ') {
tmpCurrFormatLine = tmpCurrLine.substring(0, j);
tmpCurrLeftLine = tmpCurrLine.substring(j + 1, tmpCurrLine
.length()); // keep last space
strArr.set(i, tmpCurrFormatLine);
strArr.set(i + 1, tmpCurrLeftLine + tmpNextLine);
tmpNextLine = tmpCurrLeftLine + tmpNextLine;
// System.out.println(tmpCurrFormatLine);
// System.out.println(tmpCurrLeftLine);
// System.out.println(tmpNextLine);
break;
} else {
j--;
}
}
}


private static ArrayList<String> readFromFile()
throws FileNotFoundException, IOException {
ArrayList<String> strArr = new ArrayList<String>();
FileReader reader = new FileReader("c://a.sql");
BufferedReader br = new BufferedReader(reader);
String str = null;
while ((str = br.readLine()) != null) {
strArr.add(str);
}
br.close();
reader.close();
return strArr;
}


}

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r4笔记第61天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于分页查询的优化思路(r3笔记第7天)

    目前在生产环境中有一个sql语句执行时间长达7分钟,而且执行频率极高。 其中PROC_INST中有将近6千万的数据。其中STEP_INST是一个物化视图,里面还...

    jeanron100
  • 技术学习中的三个有趣的数字

    今天聊聊我在近些年技术学习中观察到的一个有趣的现象,是三组数字:50%,90%,5%。

    jeanron100
  • ORA-01427问题的分析和解决(r6笔记第51天)

    前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因。 java.sql.SQLException: ORA-01427: sin...

    jeanron100
  • 素数求和问题

    现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和。

    书童小二
  • 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二)

    如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)。

    源码笔记
  • SpringBoot的模块及结构

    阅读源码,此时我们一定要对项目结构等有一个整体的认识,然后再进行源码分析调试 。

    码农小胖哥
  • 文化和旅游部应对疫情 推出在线公共文化和旅游服务

    ? 为丰富新型冠状病毒感染的肺炎疫情防控期间人民群众精神文化生活,进一步做好在线政务服务,按照国务院办公厅统一部署,文化和旅游部在国家政务服务平台、部网站政务...

    腾讯文旅
  • 王老板Python面试(8):​Python爬虫学到什么样就可以找工作了?

    前段时间快要毕业,而我又不想找自己的老本行Java开发,所以面了很多Python爬虫岗位。因为我在南京上学,所以我一开始只是在南京投了简历,我一共面试了十几家企...

    Python之道
  • 给爬虫爱好者的福利 SelectGadget

    相信爬虫的爱好者们都经历过这样一个爬虫前期的准备过程,那就是用浏览器的审查元素进行爬取目标的定位。每次我们都要浪费部分时间去寻找定位点和xpath,这样既不很方...

    用户2769421
  • 自定义枚举 --- Swagger文档展示

    十毛

扫码关注云+社区

领取腾讯云代金券