通过java来格式化sql语句

经常在抓取一些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代码封装一下。

点击(此处)折叠或打开

  1. public class FormatSql {
  2.     public static void main(String[] args) throws IOException {
  3.         ArrayListString> strArr = readFromFile();  //从指定的文件中读取文件内容
  4.         formatSQL(strArr);    //格式化sql文件
  5.         OutputFormatSql(strArr);  //输出格式化后的sql语句
  6.     }

完整的代码如下:
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 strArr = readFromFile();

formatSQL(strArr);

OutputFormatSql(strArr);

}

private static void formatSQL(ArrayList strArr) {
String tmpCurrLine;
String tmpNextLine;
for (int i = 0; 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 strArr) {
for (int i = 0; i
System.out.println(strArr.get(i));
}
}

private static void formatSqlLine(String tmpCurrLine, String tmpNextLine,
ArrayList 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 readFromFile()
throws FileNotFoundException, IOException {
ArrayList strArr = new ArrayList();
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;
}

}

时间: 2024-09-17 11:41:44

通过java来格式化sql语句的相关文章

将界面查询条件通过java解析成sql语句

问题描述 将界面查询条件通过java解析成sql语句 新手求助,现在做一个东西,需要将界面查询的条件进行解析成sql条件,比如传进来的 条件为(!ewew&!1)&!ce|( wewe|测试) 和查询字段为content,那么得到的解析语句为 (( content not like '%ewew%' and content not like '%1%') and ( content not like '%ce%') or ( content like '% wewe%' or conten

10种Java开发者编写SQL语句时常见错误_MsSql

Java开发者对于面向对象编程思维与命令行编程思维的协调程度,取决于他们如下几种能力的水平: 技巧(任何人都可以编写命令行形式的代码) 教条(有的人使用"模式 - 模式"的方式,即模式无处不在,并以名字作为标识) 情绪状况(在初期,真正面向对象形式的代码比起命令式代码会更加难懂.) 但是,当Java开发人员编写SQL语句时,一切都变得不同了.SQL是一种说明式语言,与面向对象思想和命令式思想无关.在SQL语言中,查询非常容易表达.但它也不是那么容易以最佳或最正确地方式编写出来.开发人员

10种Java开发者编写SQL语句时常见错误

Java开发者对于面向对象编程思维与命令行编程思维的协调程度,取决于他们如下几种能力的水平: 技巧(任何人都可以编写命令行形式的代码) 教条(有的人使用"模式 - 模式"的方式,即模式无处不在,并以名字作为标识) 情绪状况(在初期,真正面向对象形式的代码比起命令式代码会更加难懂.) 但是,当Java开发人员编写SQL语句时,一切都变得不同了.SQL是一种说明式语言,与面向对象思想和命令式思想无关.在SQL语言中,查询非常容易表达.但它也不是那么容易以最佳或最正确地方式编写出来.开发人员

挑战:java 批量查询SQL语句

问题描述 现有一批SQL语句集,此集合中的SQL语句格式不固定,但都执行的是select 查询. 要求:和数据库只建立一次连接,多次执行,每条SQL语句执行完之后都能有一个返回值.在批量操作数据方面,java提供了批量更新,但是更新要求SQL语句格式是固定的,变的只是参数.此问题,是一个挑战!欢迎各位献策! 解决方案 给你提供一个dao模板方法用Object...args语法,但只限在返回一列数据先用Object...args写一个通用的dao方法:public static List<Obje

JAVA无法执行SQL语句,在Postgresql中执行正常?不知道什么原因

问题描述 SQL语句如下:java中执行语句如下:sql="selectname,num,asText(geom)asgeom,addressfromhzpbwherehzpb.c_idin(selectc_idfromcitywherec_namelike'%江%')"rs=stmt.executeQuery(sql);在java中就是无值输出 解决方案 解决方案二:该回复于2009-04-13 13:08:35被版主删除解决方案三:子查询里没有值吧

java中执行sql语句参数设置问题

问题描述 想问下:java里面:1.String cust_no="123456";StringBuffer qry = new StringBuffer();qry.append(" SELECT * ");qry.append(" FROM TORDERDETAIL ");qry.append(" where CUST_NO =? ");pStmt = conn.prepareStatement(qry.toString(

通过pl/sql来格式化sql

在之前的一篇博文中分享了通过java来格式化sql,http://blog.itpub.net/23718752/viewspace-1444910/ 今天突然想试试通过sql来格式化一把pl/sql试试,想起来容易,做起来难,自己捣鼓了半天,总算是弄出点雏形了.简单分享一下. 我们还是格式化同一段sql语句.select /*+ leading(s) index(s TABLE_BPM_STEP_INST_5IX) use_nl(s pp step) */ s.ALLOW_CREATE, s.

mysql-java中的sql语句为何会报错,而到了workbench就可以执行

问题描述 java中的sql语句为何会报错,而到了workbench就可以执行 rt基本上是timestamp的格式,比如insert into table values ('2015-03-17 00:00:00');这句话在java通过jdbc执行就会报错,而直接在workbench下面操作就没有问题为什么会这样? 解决方案 可能是字符串单引号等引起的,打印代码中的字符串跟workbench中比较 解决方案二: insert into table(字段1,字段2....) value( 值1

sql语句-SQL累计在线时间语句的问题!!!!

问题描述 SQL累计在线时间语句的问题!!!! 表的名字叫 TblCharinfoTimeLog 人物的名字叫123,求大神帮忙弄个人物123累计在线的语句!! 我写这个语句!! 可是查询了123的信息还是 usetime=2 在线时间2分钟 在线时间累积语句 declare @usetime int select @usetime=datediff(mm,lastlogin,lastlogout) from charinfo_time where charid = @charid update