package tool;
import static java.lang.System.out;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;;
/**
* <p>
* Oracle中检索条件在1000+以上,无法直接写入同一个in里,可以通过or in的方式拼接条件,如下所示
* </p>
* <p>
* SELECT * FROM TARGET_TABLE WHERE FILED IN ('A','B','C') OR IN('D','E','F')
* </p>
* <p>
* 当条件数量巨大时,手动写or in脚本灰常困难,比如说100000条,甚至更多。这时候可以通过程序来制作相应的脚本,本程序旨在解决这一需求。
* </p>
* <p>
* mock():用于生成模拟数据,示范效果; createSqlScript():制作脚本;
* 实际使用时,需要将mock方法注释掉。详细过程可以参照代码部分。
* </p>
*
* @author jiangrx
*
*/
public class SqlScriptGenerator {
// 模拟数据条数
final static Integer COUNT = 10000;
// 脚本中or in部分数量限制,达到该数量会重新拼接or in(Oracle中in部分最多只允许1000的条件)
final static Integer LIMIT_IN = 1000;
// 脚本中全部in中条件数量限制,达到该数量会重新生成一个脚本文件
final static Integer LIMIT_FILE = 3000;
// 生成的脚本文件存放目录(该目录用于存放生成的脚本文件)
final static String TARGET_FOLDER = "D:\\temp";
// 源文件路径(该路径存放包含需要拼接的源数据的文本文件)
final static String SOURCE_FILE = "D:\\temp\\source.txt";
// 日期格式化
final static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 判断目标目录是否存在,如果不存在,则先生成目标目录
static {
File file = new File(TARGET_FOLDER);
if (!file.exists()) {
file.mkdir();
}
}
public static void main(String[] args) {
// mock();
createSqlScript();
}
/**
* 制作脚本
*/
public static void createSqlScript() {
StringBuilder sb = new StringBuilder();
FileWriter bw = null;
int lineNum = 1;
int order = 1;
out.println("开始拼接SQL脚本---" + LocalDateTime.now().format(FORMATTER));
try (BufferedReader br = new BufferedReader(new FileReader(SOURCE_FILE))) {
String l;
while ((l = br.readLine()) != null) {
if (lineNum % LIMIT_FILE == 1) {
bw = new FileWriter(TARGET_FOLDER + "\\script" + order + ".sql");
order++;
}
if (lineNum % LIMIT_IN == 0) {
bw.write(" OR IN (" + sb + "'" + l + "')");
bw.flush();
sb = new StringBuilder();
} else {
sb.append("'" + l + "',").append("\r\n");
}
lineNum++;
}
out.println("SQL脚本拼接完成---" + LocalDateTime.now().format(FORMATTER));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 制作模拟数据
*/
public static void mock() {
StringBuilder ex = new StringBuilder();
out.println("开始生成模拟数据---" + LocalDateTime.now().format(FORMATTER));
try (FileWriter fr = new FileWriter(SOURCE_FILE)) {
for (int i = 0; i < COUNT; i++) {
ex.append(String.valueOf(i + 1000000)).append("\r\n");
}
fr.write(ex.toString());
fr.flush();
out.println("模拟数据已生成---" + LocalDateTime.now().format(FORMATTER));
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
有不足之处,请不吝赐教。
来源:CSDN
作者:奈良の鹿
链接:https://blog.csdn.net/jrx1995/article/details/104542044