首页>代码>Java调用SqlLoader将大文本数据导入数据库>/SqlLoader/src/main/java/com/sun/sqlloader/api/impl/SqlLoaderImpl.java
package com.sun.sqlloader.api.impl;


import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Date;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import com.sun.sqlloader.api.ISqlLoader;
/**
 * SqlLoader接口实现
 * @ClassName: SqlLoaderImpl  
 * @author sunt  
 * @date 2017年11月15日 
 * @version V1.0
 */
@Service
public class SqlLoaderImpl implements ISqlLoader{

	private Logger logger = Logger.getLogger(SqlLoaderImpl.class);
	
	@Override
	public void ctlFileWriter(String fileRoute, String fileName, String tableName, String fieldName,String ctlfileName) {
		FileWriter fw = null;
        String strctl = "OPTIONS (skip=0)" + // 0是从第一行开始  1是 从第二行
        " LOAD DATA CHARACTERSET AL32UTF8 INFILE '"+fileRoute+""+fileName+"'" + //设置字符集编码SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
        " APPEND INTO TABLE "+tableName+"" + ////覆盖写入
        " FIELDS TERMINATED BY '\\|'" + //数据中每行记录用","分隔 ,TERMINATED用于控制字段的分隔符,可以为多个字符。|需要转译
        " OPTIONALLY  ENCLOSED BY \"'\"" + //源文件有引号 '',这里去掉    ''''"
        " TRAILING NULLCOLS "+fieldName+"";  //表的字段没有对应的值时允许为空  源数据没有对应,写入null
		try {
			fw = new FileWriter(fileRoute + "" + ctlfileName);
			fw.write(strctl);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fw.flush();
				fw.close();
			} catch (IOException e) {
				logger.error("生成控制器文件异常...");
				e.printStackTrace();
			}
		}
	}

	@Override
	public void Executive(String user, String pwd, String database, String fileRoute, String ctlfileName,String logfileName) {
		InputStream ins = null;
        //要执行的DOS命令  --数据库  用户名  密码  user/password@database
        String dos="sqlldr "+user+"/"+pwd+"@"+database+" control="+fileRoute+""+ctlfileName+" log="+fileRoute+""+logfileName;
        logger.info("执行的dos命令:" + dos);
        String[] cmd = new String[] { "cmd.exe", "/C", dos }; // 命令cmd /c dir:是执行完dir命令后关闭命令窗口cmd /k dir:是执行完dir命令后不关闭命令窗口。
		try {
			Process process = Runtime.getRuntime().exec(cmd);
			ins = process.getInputStream(); // 获取执行cmd命令后的信息

			BufferedReader reader = new BufferedReader(new InputStreamReader(ins,Charset.forName("GBK")));//解决dos下中文输出乱码
			String line = null;
			long startTime = new Date().getTime();
			while ((line = reader.readLine()) != null) {
				logger.info("调用dos执行的结果==========>" + line); // 输出
			}
			int exitValue = process.waitFor();
			if (exitValue == 0) {
				logger.info("返回值:" + exitValue + "\n数据导入成功");
				logger.info("总共耗时:" + (new Date().getTime() - startTime) / 1000 + "秒");
			} else {
				logger.info("返回值:" + exitValue + "\n数据导入失败");
			}

			process.getOutputStream().close(); // 关闭
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}
最近下载更多
wangdengzhe  LV7 2022年12月14日
zw050256  LV7 2022年11月10日
912727849  LV3 2021年3月19日
newhaijun  LV15 2020年12月29日
xingQAQ  LV7 2020年12月10日
adongliu666  LV4 2020年11月20日
玄狼之印  LV1 2020年8月18日
teslamask  LV1 2020年7月11日
yxx_yxx  LV11 2020年5月21日
sungaga  LV15 2020年3月11日
最近浏览更多
胡明杨 2023年5月4日
暂无贡献等级
夜起星河  LV8 2023年3月9日
wangdengzhe  LV7 2022年12月14日
zw050256  LV7 2022年11月10日
微信网友_6040315240812544  LV8 2022年11月3日
wangjie49  LV7 2022年10月18日
Zeorwyc  LV8 2022年4月21日
3199625134  LV10 2022年4月15日
555151  LV3 2022年3月24日
329512801  LV28 2022年1月18日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友