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

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