Java中使用Oracle的客户端 load data和sqlldr命令执行数据导入到数据库中

Windows环境下测试代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class testTimer {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // ./szrpp_files/clPath
        //写控制文件.ctl
        String fileRoute = "D:\\files\\";//文件地址路径
        String fileName = "db.txt";//数据文件名
        String tableName = "testtable";//表名
        String fieldName = "(Source,File,Date,FileNum,RechargeSerial,Status)";//要写入表的字段
        String ctlfileName = "ctlName.ctl";//控制文件名

        stlFileWriter(fileRoute,fileName,tableName,fieldName,ctlfileName);
        //要执行的DOS命令
        String user = "SCOTT";
        String psw = "123456";
        String Database = "ORCL";
        String logfileName = "logName.log";
        Executive(user,psw,Database,fileRoute,ctlfileName,logfileName);

    }

    /**
     * * 写控制文件.ctl
     * @param fileRoute 数据文件地址路径
     * @param fileName 数据文件名
     * @param tableName 表名
     * @param fieldName 要写入表的字段
     * @param ctlfileName 控制文件名
     */
    public static void stlFileWriter(String fileRoute,String fileName,String tableName,String fieldName,String ctlfileName)
    {
        FileWriter fw = null;
        String strctl = "OPTIONS (skip=0)" +
        " LOAD DATA INFILE ‘"+fileRoute+""+fileName+"‘" +
        " APPEND INTO TABLE "+tableName+"" +
        " FIELDS TERMINATED BY ‘,‘" +
        " OPTIONALLY  ENCLOSED BY \"‘\"" +
        " TRAILING NULLCOLS "+fieldName+"";
         try {
            fw = new FileWriter(fileRoute+""+ctlfileName);
            fw.write(strctl);
         }
         catch (IOException e)
        {
               e.printStackTrace();
        }
        finally {
            try
            {
                fw.flush();
                fw.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

        }
    }

    /**
     * 调用系统DOS命令
     * @param user
     * @param psw
     * @param Database
     * @param fileRoute 文件路径
     * @param ctlfileName 控制文件名
     * @param logfileName 日志文件名
     */
    public static void Executive(String user,String psw,String Database,String fileRoute,String ctlfileName,String logfileName)
    {
        InputStream ins = null;
        //要执行的DOS命令
        String dos="sqlldr "+user+"/"+psw+"@"+Database+" control="+fileRoute+""+ctlfileName+" log="+fileRoute+""+logfileName;

        String[] cmd = new String[]
        { "cmd.exe", "/C", dos }; // 命令
        try
        {
            Process process = Runtime.getRuntime().exec(cmd);
            ins = process.getInputStream(); // 获取执行cmd命令后的信息
//            BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
//            String line = null;
//            while ((line = reader.readLine()) != null)
//            {
//                String msg = new String(line.getBytes("ISO-8859-1"), "UTF-8");
//                System.out.println(msg); // 输出
//            }
            int exitValue = process.waitFor();
            if(exitValue==0)
            {
                System.out.println("返回值:" + exitValue+"\n数据导入成功");

            }else
            {
                System.out.println("返回值:" + exitValue+"\n数据导入失败");

            }

            process.getOutputStream().close(); // 关闭
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

Linux环境下的测试代码:

import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;

public class TestLinux {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // ./szrpp_files/clPath
        //写控制文件.ctl

        String fileRoute = "/home/test/files/clPath/";//文件地址路径
        String fileName = "db.txt";//数据文件名
        String tableName = "testtable";//表名
        String fieldName = "(Source,File,Date,FileNum,Status)";//要写入表的字段
        String ctlfileName = "ctltest.ctl";//控制文件名

        stlFileWriter(fileRoute,fileName,tableName,fieldName,ctlfileName);
        //要执行的DOS命令
        String user = "scott";
        String psw = "123456";
        String Database = "ORCL";
        String logfileName = "logtext.log";
        Executive(user,psw,Database,fileRoute,ctlfileName,logfileName);
    }

    /**
     * * 写控制文件.ctl
     * @param fileRoute 数据文件地址路径
     * @param fileName 数据文件名
     * @param tableName 表名
     * @param fieldName 要写入表的字段
     * @param ctlfileName 控制文件名
     */
    public static void stlFileWriter(String fileRoute,String fileName,String tableName,String fieldName,String ctlfileName)
    {
        FileWriter fw = null;
        String strctl = "OPTIONS (skip=0)" +
        " LOAD DATA INFILE ‘"+fileRoute+""+fileName+"‘" +
        " APPEND INTO TABLE "+tableName+"" +
        " FIELDS TERMINATED BY ‘,‘" +
        " OPTIONALLY  ENCLOSED BY \"‘\"" +
        " TRAILING NULLCOLS "+fieldName+"";
         try {
            fw = new FileWriter(fileRoute+""+ctlfileName);
            fw.write(strctl);
         }
         catch (IOException e)
        {
               e.printStackTrace();
        }
        finally {
            try
            {
                fw.flush();
                fw.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

        }
    }

    /**
     * 调用系统DOS命令
     * @param user
     * @param psw
     * @param Database
     * @param fileRoute 文件路径
     * @param ctlfileName 控制文件名
     * @param logfileName 日志文件名
     */
    public static void Executive(String user,String psw,String Database,String fileRoute,String ctlfileName,String logfileName)
    {
        InputStream ins = null;
        //要执行的DOS命令
        String dos="sqlldr "+user+"/"+psw+"@"+Database+" control="+fileRoute+""+ctlfileName+" log="+fileRoute+""+logfileName;
        //Linux环境下注释掉
        //String[] cmd = new String[]
        //{ "cmd.exe", "/C", dos }; // Windows环境 命令
        try
        {
            Process process = Runtime.getRuntime().exec(dos);
            ins = process.getInputStream(); // 获取执行cmd命令后的信息
//            BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
//            String line = null;
//            while ((line = reader.readLine()) != null)
//            {
//                String msg = new String(line.getBytes("ISO-8859-1"), "UTF-8");
//                System.out.println(msg); // 输出
//            }
            int exitValue = process.waitFor();
            if(exitValue==0)
            {
                System.out.println("返回值:" + exitValue+"\n数据导入成功");

            }else
            {
                System.out.println("返回值:" + exitValue+"\n数据导入失败");

            }

            process.getOutputStream().close(); // 关闭
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

特别注意:

1.你的程序部署在什么服务器下面 是在Oracle数据库服务器下 数据库连接配置地址可以不指明,如果部署在其他服务器下不在数据库服务器下数据库名的连接地址要指向明确的 所在数据库服务器IP地址,这个自己可以多次试验测试就晓得了。

2.测试程序只是实现了功能,但是放到你的项目程序中一定要多多测试自然会发现问题的,这个测试代码放到你的项目中时候一定要注意一些代码的改造,具体自己多测试就发现了。可以简单说明下 就在Executive()这个方法里面的代码只要稍加改造就好了,自己摸索下就明白了。

3.控制文件路径最好这样使用在引用到项目中时候:control="+clPath+File.separator+ctlfileName+"  log="+clPath+File.separator+logfileName

4.针对这段代码具体描述下

String strctl = "OPTIONS (skip=0)" +   // 0是从第一行开始  1是 从第二行
        " LOAD DATA INFILE ‘"+fileRoute+""+fileName+"‘" +
        " APPEND INTO TABLE "+tableName+"" + //覆盖写入
        " FIELDS TERMINATED BY ‘,‘ " +  //--数据中每行记录用","分隔 ,TERMINATED用于控制字段的分隔符,可以为多个字符。
        " OPTIONALLY  ENCLOSED BY \"‘\"" +  //源文件有引号 ‘‘,这里去掉    ‘‘‘‘"
        " TRAILING NULLCOLS "+fieldName+"";//--表的字段没有对应的值时允许为空  源数据没有对应,写入null

  

时间: 2024-11-02 20:34:33

Java中使用Oracle的客户端 load data和sqlldr命令执行数据导入到数据库中的相关文章

Java版将EXCEL表数据导入到数据库中

1.采用第三方控件JXL实现 try { //实例化一个工作簿对象 Workbook workBook=Workbook.getWorkbook(new File("F://qzlx.xls")); //获取该工作表中的第一个工作表 Sheet sheet=workBook.getSheet(0); //获取该工作表的行数,以供下面循环使用 int rowSize=sheet.getRows(); for(int i=0;i<rowSize;i++) { //编号 String

java实现EXCEL数据导入到数据库中的格式问题的解决

之前作为项目甲方,加之java接触不多,在java web开发方面都是打下手的份. 对于EXCEL数据导入到数据库这个问题一直老是出现格式原因而导入失败也是未免惆怅,开发团队也是只说回去检查一下格式. 但是,每次导入的时候还会因为格式问题而惴惴不安,最近把代码拿来研究了一下,网上查了一下. 原来是从cell里取出数据后没有做格式匹配直接赋值导致的.因此,在取出数据写入数据库前做一下格式匹配就好了. SO FRUSTRATED BY THE PREVIOUS IGNORANCE! 1 //把EXC

将csv和txt 数据导入到数据库中

将文本数据导入到数据库中,最简单的选择是:Excel使用OpenSet,csv和txt 使用bulk insert来实现 1,使用OpenRowSet将Excel导入到数据库中 参考<OpenRowSet 用法> 2,使用bulk insert 将txt数据导入到数据库中,文本数据使用Tab分割Column,使用换行符分割row. --create staging table create table dbo.txt_staging ( col1 nvarchar(255), col2 nva

把excel中的数据导入到数据库中的通用方法

方法/步骤 对于把大量数据存放到数据库中,最好是用图形化数据库管理工具,可是如果没有了工具,只能执行命令的话这会是很费时间的事.那我们只能对数据进行组合,把数据组成insert语句然后在命令行中批量直行即可.   我们对下面数据进行组合,这用到excel中的一个功能. 在excel中有个fx的输入框,在这里把组好的字符串填上去就好了. 注:字符串1 & A2 &字符串2 & ... A2可以直接输入,也可以用鼠标点对应的单元格.   每个字符串之间用 & 符号进行连接.下面

将 excel文件数据导入MySQL数据库中

第一步:先将Excel文件另存为文本文件(制表符分割) 第二步:将生成的txt文件另存,并修改编码格式utf8; 第三步:将文件放到指定位置,或自己想要的位置: G:\city.txt 第四步:避免创建数据库及表出现中文乱码和查看编码方法: 1.创建数据库的时候:CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; 查询字符编码: show variables like'character%'; 将数据库修改

文件(csv/xslx)中的数据导入到数据库中

*.sql文件导入数据库通常比较方便. 其他格式如csv.xsl等文件导入比较费劲. 推荐一个针对csv\xsl的导入工具:https://github.com/zhengze/file_to_db.git 具体用法请看README: load data from csv/xlsx into database(mysql/postgresql) INSTALL pipenv install #或者 pip install -r requirements.txt CONFIG $sudo touc

sqlserver怎么将excel表的数据导入到数据库中

在数据库初始阶段,我们有些数据在EXCEL中做好之后,需要将EXCEL对应列名(导入后对应数据库表的字段名),对应sheet(改名为导入数据库之后的表名)导入指定数据库, 相当于导入一张表的整个数据.导入之前需要检查是否存在同名的表,导入的数据表以"$"结尾就是为了避免表重复,以作区分.下面就来看看具体操作步骤. 1 打开SQL Server Management Studio,按图中的路径进入导入数据界面. 2 导入的时候需要将EXCEL的文件准备好,不能打开.点击下一步. 数据源:

Excel的数据导入到数据库中

导入数据的时候就是怎么链接Excel表?链接的时候最好有后缀名. DataSet myDataSet = new DataSet(); //创建一个数据链接 string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + fileName + ";Extended Properties=Excel 8.0"; OleDbConnection myConn = new OleDbConn

如何将excel导入到数据库中并在gridview中显示

在页面上导入个excel文件,将该excel中的数据导入到数据库中,并且在页面的gridview中把数据显示出来. 1.在Asp.net中怎样将Excel文件中的数据导入到GridView中呢? 首先我们将这张表中的数据转换为DataTable类型的数据源,做一个函数来解决这个问题 private DataTable createDataSource(string strPath) { stringstrCon; strCon = "Provider=Microsoft.Jet.OLEDB.4.