前提:安装了oracle客户端。
在“开始”->“运行”,输入“cmd”,回车。在打开的dos窗口里输入:sqlldr。看看是否安装了
下面,我为了快速学习,先忽略参数的说明。只管用一个简单的例子。
我在本机上安装了Linux的oracle数据库,现在先建立一个测试的表:
createtable 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@jscscontrol=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@jscscontrol=d:\test2.ctl
例3:创建如下字符串结构表
load data
infile DED201007
30099.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@jscscontrol=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_USED, GENERATE_ONLY, EXECUTE(默认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 TABLEtable_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; }