linux java sqlldr_java sqlldr使用

前提:安装了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 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@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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell脚本,可是在java代码中调用shell脚本时,报了如下4个错误: 1、sqlldr: command not found 2、sqlplus: command not found 3、0750: You may need to set ORACLE_HOME to your Oracle software directory 4、Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL$ 检查了dba用户和web用户下关于oracle的所有环境变量发现没有问题 (/home/oracle/.profile 与 /home/erm/.profile 环境变量文件为隐藏文件需使用 ls -a 命令查看) 在网上查了一遍以后有如下几种处理办法: 1、没有oracle_home目录的执行权限,无法进入到bin目录,使用chmod 755 $oracle_home更改目录权限;使用chmod 755 $oracle_home/lib更改目录权限;对目录$oracle_home/rdbms/mesg目录赋予相应权限;当需要给非oracle用户配置使用sqlldr时,不单需要配置环境变量,还需要把相关目录的访问权限赋予该用户。【采用此法测试以后还是出现上面的错误】 2、用sh直接执行shell和在java直接执行shell是有区别的,要在shell文件内增加oracle的环境变量即. /home/oracle/.bash_profile 这句话,否则在执行sqlldr会报如下异常: Message 2100 not found; No message file for product=RDBMS...... facility=UL 【采用此法测试以后继续报错,但是这个方法有引导作用,继续往下看】 因为我在linux环境下执行shell脚本时sqlldr命令和sqlplus命令是正常执行的,没有任何问题,但是在java代码中调用脚本时却报错,所有排除了其他原因,只可能是环境变量的问题, 于是我把oracle的所有环境变量直接复制到shell脚本文件中,在java中调用了一下,然后所有问题迎刃而解! 具体代码参看文件内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值