java sqlldr使用

前提:安裝了oracle客戶端。

在“開始”->“運行”,輸入“cmd”,回車。在打開的dos窗口裏輸入:sqlldr。看看是否安裝了

 

 

下面,我爲了快速學習,先忽略參數的說明。只管用一個簡單的例子。

 

我在本機上安裝了Linuxoracle數據庫,現在先建立一個測試的表:

create table tdsxhwn.tbtestsqlldr(
id int,
name varchar(
10)
)
然後配置一個連接服務,別名爲LOCALHOST_ORCL

打開PL/SQL即可看

如果沒有PL/SQL,也可以在$ORACLE_HOME\client_1\NETWORK\ADMIN\tnsnames.ora文件找到:

LOCALHOST_ORCL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = orcl)

    )

  )

 

 

 

 

 

 

 

 

 

 


 

現在,我在“D:\sqlldr”文件夾裏創建兩個文件:

control.txt文件

 

data.txt

然後在剛纔的dos窗口裏輸入:

sqlldr userid=tdsxhwn/td$123@LOCALHOST_ORCL control=d:\sqlldr\control.txt log= d:\sqlldr\out.log

上面sqlldr的格式是:

sqlldr userid=用戶/密碼@服務別名 control= control文件路徑 log=日誌文件路徑

 

通過例子來學習
1:用包含數據的文本導入.
1)
、現在有一個要導入數據庫的數據的文本1.txt,文件存放路徑d:\1.txt,格式如下:
123,312u

124,dsfsd
5423,rtdf34
2)
、在數據庫中創建要導入的表test(數據庫用戶名/密碼:test/test,默認在本機)
create table test
(num number(11),
var varchar2(12)
)
3)
、編寫ctl控制文件 test.ctl,文件存放路徑:d:\test.ctl
load data
infile 'd:\1.txt'
append into table test
fields terminated by ','
(num,var)
4)
、命令提示符下執行一下命令
sqlldr userid=jscs/jscs
@jscs control=d:\test.ctl
注:
infile 'd:\1.txt' //
需要裝載的數據文件的路徑,如果數據在本文件中,則用infile *
append into table test //
數據載入的表:
(1)append
表示表中有數據,加在後面
(2)INSERT
表示裝入空表,有數據則停止。默認值
(3)REPLACE
原先表中如果有數據,會被刪除
(4)TRUNCATE
如果要載入的數據與現在的數據相同,載入的數據替換現存的數據。
fields terminated by ','
//
數據用是','格開的,如上(1)處,用by X'09',16進制的"09"代表TAB製表符,常用於excel轉換的tab製表符文件的數據的導入
(num,var) //
數據表中要載入的字段
2:要導入的數據在ctl文件中
1)
數據庫表同上例1
2)
編寫ctl控制文件test2.ctl,文件存放路徑:d:\test2.ctl
load data

CHARACTERSET 'UTF8'-----字符集設定,這樣才能導入中文
infile *
append into table test
fields terminated by ','

trailing nullcols---------表示允許爲空
(num,var,dat  DATE "YYYY-MM-DD HH24:MI:SS)

begindata
123,312u,2011-12-11 11:11:11
124,dsfsd,2011-12-11
5423,rtdf34,2011-12-11 12:11:11
............
3)
命令提示符下執行一下命令
sqlldr userid=jscs/jscs
@jscs control=d:\test2.ctl

3:創建如下字符串結構表

load data

infile DED20100730099.531

append into table ask_tem_ded

(recordtag position (01:02) char(2),

event_type position (03:12) char(10),

dedtype position (13:14) char(2),

serial position (15:34) char(20),

msisdn position (35:49) char(15),

spcode position (50:69) char(20),

opercode position (70:89) char(20),

chrgtype position (90:91) char(2),

lastdate position (92:105) char(14),

dedtime position (106:119) char(14),

dedfee position (120:125) char(6),

preserve position (126:145) char(20)

)

sqlldr userid=jscs/jscs@jscs control=d:\test2.ctl

―――――――――――――――――參數說明――――――――――――――――――

二、有效的關鍵字:

   userid -- ORACLE username/password

   control – 控制文件

   log – 記錄的日誌文件

   bad – 壞數據文件

   data – 數據文件

   discard – 丟棄的數據文件

   discardmax – 允許丟棄數據的最大值        (全部默認)

   skip -- Number of logical records to skip  (默認0)

   load -- Number of logical records to load  (全部默認)

   errors – 允許的錯誤記錄數          (默認50)

   rows -- Number of rows in conventional path bind array or between direct path data saves(每次提交的記錄數,默認常規路徑 64, 所有直接路徑)

   bindsize -- Size of conventional path bind array in bytes(默認256000)

每次提交記錄的緩衝區的大小(字節爲單位,默認256000)

    silent --禁止輸出信息 (header,feedback,errors,discards,partitions)

    direct – 使用直通路徑方式導入                    (默認FALSE)

    parfile -- parameter file: name of file that contains parameter specifications

    parallel -- 並行導入                   (默認FALSE)

    file -- File to allocate extents from

    skip_unusable_indexes    -- disallow/allow unusable indexes or index partitions(默認FALSE)

    skip_index_maintenance   -- do not maintain indexes, mark affected indexes as unusable(默認FALSE)

    readsize -- Size of Read buffer                (默認1048576)

    bindsize成對使用,其中較小者會自動調整到較大者。sqlldr先計算單條記錄長度,乘以rows,如小於bindsize,不會試圖擴張rows以填充bindsize;如超出,則以bindsize爲準。

 

     external_table       -- use external table for load; NOT_USEDGENERATE_ONLYEXECUTE(默認NOT_USED)

     columnarrayrows     -- Number of rows for direct path column array(默認5000)

     streamsize        -- Size of direct path stream buffer in bytes(默認256000)

     multithreading       -- use multithreading in direct path

     resumable -- enable or disable resumable for current session(默認FALSE)

     resumable_name       -- text string to help identify resumable statement

     resumable_timeout       -- wait time (in seconds) for RESUMABLE(默認7200)

     date_cache -- size (in entries) of date conversion cache(默認1000)

 

     注意:有兩種方式可以指定命令行參數:通過位置或者通過關鍵字。

     1)通過位置指定命令行參數的例子:'sqlldr scott/tiger foo'

     2)通過關鍵字指定命令行參數的例子:'sqlldr control=foo userid=scott/tiger'

     不能前面使用關鍵字指定後面通過位置指定的混合方式;

     比如:'sqlldr scott/tiger control=foo logfile=log' 是允許的;

     'sqlldr scott/tiger control=foo log'不允許。

     通過位置指定命令行參數的時候,必須將位置放在user/passwd之前。

     爲清楚起見最好所有命令行參數都用關鍵字指定。

三、控制文件:一個控制命令的腳本文件,通常以ctl結尾,內容如下:

LOAD DATA 

INFILE 't.dat'              //要導入的文件 

// INFILE 'tt.date'        //導入多個文件 

// INFILE *                  //表示要導入的內容就在control文件裏 下面的BEGINDATA後面就是導入的內容 

INTO TABLE table_name   // 指定裝入的表 

BADFILE 'c:\bad.txt'    //可選,指定壞文件地址,缺省在當前目錄下生成與原文件名一致的.bad文件 

//************* 以下是4種裝入表的方式 

APPEND           // 原先的表有數據 就加在後面 

// INSERT            //裝載空表 如果原先的表有數據 sqlloader會停止 默認值 

// REPLACE       //  原先的表有數據 原先的數據會全部刪除 

// TRUNCATE            //  指定的內容和replace的相同 會用truncate語句刪除現存數據 

 

//************* 指定分隔符 

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 

// TERMINATED BY WRITESPACE //以空白分割 

 

 用java運行sqlldr:

 private void runSqlldr(String path, String logPath) {
  // java運行sqlldr
  try {
   String s = "sqlldr userid=" + info.getGoalUser() + "/"
     + info.getGoalPassword() + "@" + info.getDbAlias()
     + " control=" + path + " log=" + logPath
     + " errors=1000000 rows=10000";
   Process process = Runtime.getRuntime().exec(s);

  doWaitFor(process);

//這裏就該執行完了
   process.destroy();
   process = null;

  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

private int doWaitFor(Process p) {
  int exitValue = -1; // returned to caller when p is finished
  InputStream in = null;
  InputStream err = null;
  try {
   in = p.getInputStream();
   err = p.getErrorStream();
   boolean finished = false; // Set to true when p is finished
   while (!finished) {
    try {
     while (in.available() > 0) {
      // Print the output of our system call
      in.read();
     }
     while (err.available() > 0) {
      // Print the output of our system call
      err.read();
     }
     exitValue = p.exitValue();
     finished = true;
    } catch (IllegalThreadStateException e) {
    }
   }
  } catch (Exception e) {
   // unexpected exception! print it out for debugging...
   e.printStackTrace();
  } finally {
   if (in != null) {
    try {
     in.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   if (err != null) {
    try {
     err.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
  // return completion status to caller
  return exitValue;
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章