您的位置:首页 > 数据库 > Oracle

Oracle SQL Loader的详细语法

2010-04-14 19:07 246 查看

Oracle
SQL
Loader
的详细语法

Oracle
SQL
Loader

的详细语法


SQL
*LOADER


ORACLE

的数据加载工具,通常用来将操作系统文件迁移到
ORACLE

数据库中。
SQL
*LOADER

是大型数据



仓库选择使用的加载方法,因为它提供了最快速的途径(
DIRECT

PARALLEL

)。现在,我们抛开其理论不谈,用实例来使您快速掌握
SQL
*LOADER

的使用方法。



首先,我们认识一下
SQL
*LOADER






NT
下,
SQL
*LOADER

的命令为
SQLLDR
,在
UNIX
下一般为
sqlldr/sqlload




如执行:
d:/oracle
>sqlldr


SQL
*Loader
: Release 8.1.6.0.0 - Production on
星期二
1

8 11:06:42 2002

(c) Copyright 1999 Oracle
Corporation. All rights reserved.


用法
: SQLLOAD
关键字
=

[,keyword=value,...]


有效的关键字
:

userid -- ORACLE
username/password

control -- Control file name

log -- Log file name

bad -- Bad file name

data -- Data file name

discard -- Discard file name

discardmax -- Number of discards to allow (

全部默认
)

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

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

errors -- Number of errors to allow (
默认
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(
默认
65536)

silent -- Suppress messages during run (header,feedback,errors,discards,partitions)

direct -- use direct path (
默认
FALSE)

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

parallel
-- do parallel
load (
默认
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)

commit_discontinued -- commit loaded rows when load is discontinued(
默认
FALSE)

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


PLEASE NOTE:
命令行参数可以由位置或关键字指定



。前者的例子是
'sqlload scott/tiger foo';
后者的例子是
'sqlload control=foo userid=scott/tiger'.
位置指定参数的时间必须早于但不可迟于由关键字指定的参数。例如
,

'SQLLOAD SCott/tiger control=foo logfile=log',

'
不允许


sqlload scott/tiger control=foo log',
即使允许
参数
'log'
的位置正确。


d:/oracle
>


我们可以从中看到一些基本的帮助信息,这里,我用到的是中文的
WIN2000
 
ADV
 
SERVER




  

我们知道,
SQL
*LOADER

只能导入纯文本,所以我们现在开始以实例来讲解其用法。



  

一、已存在数据源
result.csv
,欲倒入
ORACLE


FANCY
用户下。



    
result.csv
内容:



  
1,
默认
Web
站点
,192.168.2.254:80:,RUNNING


  
2,other,192.168.2.254:80:test.com,STOPPED


  
3,third,192.168.2.254:81:thirdabc.com,RUNNING


  

从中,我们看出
4
列,分别以逗号分隔,为变长字符串。



  

二、制定控制文件
result.ctl

result.ctl
内容:


load data

infile 'result.csv'

into table resultxt

(resultid char terminated by ',',

website char terminated by ',',

ipport char terminated by ',',

status char terminated by whitespace)


  

说明:



  
infile
 指数据源文件 这里我们省略了默认的 
discardfile result.dsc badfile result.bad


  
into table resultxt
默认是
INSERT
,也可以
into table resultxt APPEND
为追加方式,或
REPLACE


  
terminated by ','
 指用逗号分隔



  
terminated by whitespace
 结尾以空白分隔



  

三、此时我们执行加载:


D:/>sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out


SQL
*Loader
: Release 8.1.6.0.0 - Production on
星期二
1

8 10:25:42 2002

(c) Copyright 1999 Oracle
Corporation. All rights reserved.

SQL
*Loader
-941:
在描述表
RESULTXT
时出现错误


ORA-04043:
对象
RESULTXT
不存在



  

提示出错,因为数据库没有对应的表。



  

四、在数据库建立表



 
create table resultxt

(resultid varchar2(500),

website varchar2(500),

ipport varchar2(500),

status varchar2(500))

/

  

五、重新执行加载



  
D:/>sqlldr userid=fancy/k1i7l6l8 control=result.ctl log=resulthis.out

SQL
*Loader
: Release 8.1.6.0.0 - Production on
星期二
1

8 10:31:57 2002

(c) Copyright 1999 Oracle
Corporation. All rights reserved.


达到提交点,逻辑记录计数
2


达到提交点,逻辑记录计数
3


  

已经成功!我们可以通过日志文件来分析其过程:
resulthis.out
内容如下:


SQL
*Loader
: Release 8.1.6.0.0 - Production on
星期二
1

8 10:31:57 2002

(c) Copyright 1999 Oracle
Corporation. All rights reserved.


控制文件
: result.ctl


数据文件
: result.csv


错误文件
: result.bad


废弃文件
:
未作指定


:

(
可废弃所有记录
)


装载数
: ALL


跳过数
: 0


允许的错误
: 50


绑定数组
: 64
行,最大
65536
字节



继续
:
未作指定



所用路径
:
常规




RESULTXT


已载入从每个逻辑记录



插入选项对此表
INSERT
生效



列名

位置

长度

中止

包装数据类型


------------------------------ ---------- ----- ---- ---- ---------------------

RESULTID FIRST * , CHARACTER

WEBSITE NEXT * , CHARACTER

IPPORT NEXT * , CHARACTER

STATUS NEXT * WHT CHARACTER



RESULTXT:

3
行载入成功



由于数据错误
, 0
行没有载入。



由于所有
WHEN
子句失败
, 0
行没有载入。



由于所有字段都为空的
, 0
行没有载入。



为结合数组分配的空间
: 65016
字节(
63
行)



除绑定数组外的内存空间分配
: 0
字节



跳过的逻辑记录总数
: 0


读取的逻辑记录总数
: 3


拒绝的逻辑记录总数
: 0


废弃的逻辑记录总数
: 0


从星期二
1

08 10:31:57 2002
开始运行



在星期二
1

08 10:32:00 2002
处运行结束



经过时间为
: 00: 00: 02.70

CPU
时间为
: 00: 00: 00.10(




  

六、并发操作


sqlldr userid=/ control=result1.ctl direct=true parallel
=true

sqlldr userid=/ control=result2.ctl direct=true parallel
=true

sqlldr userid=/ control=result2.ctl direct=true parallel
=true



当加载大量数据时(大约超过
10GB
),最好抑制日志的产生:



  
SQL
>ALTER TABLE RESULTXT nologging;



这样不产生
REDO
 
LOG
,可以提高效率。然后在
CONTROL
文件中
load data
上面加一行:
unrecoverable
此选项必须要与
DIRECT
共同应用。



 在并发操作时,
ORACLE

声称可以达到每小时处理
100GB
数据的能力!其实,估计能到
1

10G
就算不错了,开始可用结构
相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。



有关
SQLLDR
的问题



控制文件:
input.ctl
,内容如下:



  
load data

          
--1
、控制文件标识



  
infile 'test.txt'
      
--2
、要输入的数据文件名为
test.txt


  
append into table test
    
--3
、向表
test
中追加记录



  
fields terminated by X'09'
  
--4
、字段终止于
X'09'
,是一个制表符(
TAB




  
(id,username,password,sj)
  
-----
定义列对应顺序





其中
append
为数据装载方式,还有其他选项:


a

insert
,为缺省方式,在数据装载开始时要求表为空


b

append
,在表中追加新记录


c

replace
,删除旧记录,替换成新装载的记录


d

truncate
,同上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: