你的位置:首页 > Java教程

[Java教程]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();    }  }}

View Code

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

View Code

 特别注意:

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