• sqlloader导入数据


    适用场景:oracle数据库需要导入大量的数据,数据源来自txt文件。

    Sqlloader.java

      1 import java.io.BufferedReader;
      2 import java.io.BufferedWriter;
      3 import java.io.File;
      4 import java.io.FileNotFoundException;
      5 import java.io.FileOutputStream;
      6 import java.io.InputStreamReader;
      7 import java.io.OutputStreamWriter;
      8 import java.io.UnsupportedEncodingException;
      9 
     10 public class SqlLoad {
     11     //数据库配置信息
     12     private static String dbconnStr="bxw/root@ORCL";
     13     
     14     /** java运行dos命令将txt文件下的数据导入到oracle
     15      * 没有ctlfile
     16      * @param args
     17      */
     18     public void sqlldr (String infile,String tablename,String split_flag,String ctlfile){
     19         Runtime rt=Runtime.getRuntime();
     20         Process proc;    
     21         String ctl_path=createloadctl(infile,tablename,split_flag,ctlfile);    
     22         String log_path=ctl_path.substring(0,ctl_path.indexOf(".")+1)+"log";
     23         String cmdstr="sqlldr "+dbconnStr+" control="+ctl_path+" log="+log_path+" skip=1";
     24         System.out.println("cmd命令:"+cmdstr);
     25         try{ 
     26             proc = rt.exec(cmdstr);
     27         }catch (Exception e) {
     28             System.out.println(" error while running sqlldr!");
     29         }
     30     }
     31     
     32     /**
     33      * 有ctlfile
     34      * @param ctl_path
     35      */
     36     public void sqlldr (String ctl_path){
     37         Runtime rt=Runtime.getRuntime();
     38         Process proc;
     39         String log_path=ctl_path.substring(0,ctl_path.indexOf(".")+1)+"log";
     40         String cmdstr="sqlldr "+dbconnStr+" control="+ctl_path+" log="+log_path+" skip=1";
     41         System.out.println("cmd命令:"+cmdstr);
     42         try{
     43             proc = rt.exec(cmdstr);
     44         }catch (Exception e) {
     45             System.out.println(" error while running sqlldr!");
     46         }
     47     }
     48     
     49     /** 创建ctl文件
     50      * @param infile:有数据的txt文档
     51      * @param tablename:要导入的oracle数据表
     52      * @param split_flag:导入的数据以何种标志分割字段
     53      * @param ctl文件的最终存放路径
     54      */
     55     public String createloadctl(String infile,String tablename,String split_flag,String ctlfile){            
     56         if (tablename=="" || tablename==null){
     57             System.out.println("数据库名称不能为空!!");
     58         }
     59         
     60         if (ctlfile=="" || ctlfile==null){
     61             String path="F:\sqlloadTest\";
     62             ctlfile=path+"lc_sqlldr.ctl";
     63             System.out.println("路径:"+ctlfile);
     64         }
     65         
     66         File out_file=new File(ctlfile);
     67         try {
     68             if (out_file.exists()){
     69                 out_file.delete();
     70             }else{
     71                 out_file.createNewFile();
     72             }
     73         }catch(Exception ex){
     74             ex.printStackTrace();
     75         }
     76         
     77         /*
     78          * 编写ctlfile的格式
     79          */
     80         StringBuffer sb = new StringBuffer();
     81         sb.append("load data");
     82         sb.append("
    ");
     83         sb.append("infile ");
     84         sb.append("'");
     85         sb.append(infile);
     86         sb.append("'");
     87         sb.append("
    ");
     88         sb.append("append into table ");
     89         sb.append(tablename);
     90         sb.append("
    ");
     91         sb.append("fields terminated by ");
     92         sb.append("'");
     93         sb.append(split_flag);
     94         sb.append("'");
     95         sb.append("
    ");
     96         sb.append("(id,name,price,author,pubishdate  DATE"YYYY-MM-DD HH24:MI:SS")");
     97         
     98         String sbstr=sb.toString();
     99         
    100         String ctlstr="load data"+"
    "+
    101                 "infile "+"'"+infile+"'"+"
    "+
    102                 "append into table "+tablename+"
    "+
    103                 "fields terminated by "+"'"+split_flag+"'"+"
    "+
    104                 "(id,name,price,author,pubishdate  DATE"YYYY-MM-DD HH24:MI:SS")";
    105         System.out.println(ctlstr);
    106         try{
    107             //将数据库数据写入指定的txt文件
    108             File file = new File(ctlfile);  //自定义文件路径
    109             OutputStreamWriter write;
    110             //write = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
    111             write = new OutputStreamWriter(new FileOutputStream(file));
    112             BufferedWriter writer = new java.io.BufferedWriter(write);
    113             writer.write(ctlstr);  // 输出流写入到文件中
    114             writer.close();
    115             write.close();
    116         }catch(UnsupportedEncodingException e){
    117             e.printStackTrace();
    118         }catch(FileNotFoundException e){
    119             e.printStackTrace();
    120         }catch(Exception ex){
    121             ex.printStackTrace();
    122         }
    123         
    124         return ctlfile;
    125     }
    126     
    127     public static void main(String[] args) {
    128         String infile="F:\sqlloadTest\data.txt";
    129         String tablename="book";
    130         String split_flag="|";
    131         String ctlfile="F:\sqlloadTest\lc_loader.ctl";
    132         SqlLoad loader=new SqlLoad();
    133         loader.sqlldr(infile, tablename, split_flag, ctlfile);
    134         //loader.sqlldr(ctlfile);
    135     }
    136 
    137 }
  • 相关阅读:
    Android学习小Demo(20)关于Fragment的应用
    计算机常识--框架、编程语言篇
    用python做oj上的简单题(持续更新中.......)
    UIControl-IOS开发
    Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 具体解释
    包管理器Bower使用手冊之中的一个
    23web app实现上下左右滑动
    iOS IAP教程
    一步一步写算法(之 A*算法)
    执行游戏时出现0xc000007b错误的解决方法
  • 原文地址:https://www.cnblogs.com/popcornya/p/6952885.html
Copyright © 2020-2023  润新知