通过程序实现SQL脚本检索条件拼接

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();
		}

	}

}

有不足之处,请不吝赐教。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值