a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 53|回复: 0

[综合] Oracle认证:OracleSQLLoader的详细语法

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
Oracle认证:OracleSQLLoader的详细语法& x) B- e- n1 l( D8 g9 Y
SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据4 a7 D# F: s. d1 v7 Y4 J7 t
仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。现在,我们抛开其理论不谈,用实例来使您快速掌握SQL*LOADER的使用方法。. r- |( @; V( b+ Q
首先,我们认识一下SQL*LOADER。
& o; T( ^0 m0 m5 M* V在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload。
, o, I5 _3 `9 P: Z$ x3 B如执行:d:\oracle》sqlldr; E: O, Z- d5 `% ^9 P, w
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:06:42 2002
% _4 K( j% C# O$ d5 w% Q(c) Copyright 1999 Oracle Corporation. All rights reserved.
; Q1 E4 E1 G& Q% `+ E% k用法: SQLLOAD 关键字 = 值 [,keyword=value,。..]
) ]+ j$ ~( p$ M有效的关键字:
  s- @0 ~) h% G. m1 Fuserid -- ORACLE username/password
8 k5 [: w: f7 S6 Pcontrol -- Control file name
- y. I/ m9 f; P% `* h3 Glog -- Log file name
7 v6 D  ^4 N) A6 y7 P! Vbad -- Bad file name# _- S3 ^5 L9 X5 a% k$ p
data -- Data file name
8 X! w0 h4 Q% J/ I2 P; ]7 \* {discard -- Discard file name
0 A) z1 X' ^' r) K4 B+ l  Ldiscardmax -- Number of discards to allow (全部默认)
: j3 P  G  m$ P  m- Y( ^  z' vskip -- Number of logical records to skip (默认0)# {: f4 F# r) `; D
load -- Number of logical records to load (全部默认)9 l' K9 s; q$ x3 a+ r
errors -- Number of errors to allow (默认50)2 @' p- x( A/ c3 I1 w
rows -- Number of rows in conventional path bind array or between direct path data saves
: H* @% [$ |4 l4 s* g(默认: 常规路径 64, 所有直接路径)
) D+ k7 Z( ]6 b/ Xbindsize -- Size of conventional path bind array in bytes(默认65536)7 L! a- l# n; m& k& q3 r
silent -- Suppress messages during run (header,feedback,errors,discards,partitions)
( E3 ~! z8 p3 f- k% B# S7 w0 v) f) K) g$ ?direct -- use direct path (默认FALSE)& T& H2 p5 h6 t. a$ d4 A
parfile -- parameter file: name of file that contains parameter specifications' A! {9 t9 [1 S3 I. v7 j6 V
parallel -- do parallel load (默认FALSE)2 K* k6 Z8 `9 ^, o. [% w* |* l1 e& u
file -- File to allocate extents from
/ a, a# l  [. E6 e/ h+ R5 d% cskip_unusable_indexes -- disallow/allow unusable indexes or index partitions(默认FALSE)7 S, z( p1 D2 \, f# K4 X1 n
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable(默认FALSE)
% y8 {( ^- [7 I3 x% Q% Gcommit_discontinued -- commit loaded rows when load is discontinued(默认FALSE)! ?# @6 v* N) w3 m* A
readsize -- Size of Read buffer (默认1048576)
0 P/ b, b. Y7 I" U  a1 VPLEASE NOTE: 命令行参数可以由位置或关键字指定7 j6 E3 s* I$ F5 X* Y& @
。前者的例子是 ‘sqlload scott/tiger foo’;后者的例子是 ‘sqlload control=foo userid=scott/tiger’。位置指定参数的时间必须早于但不可迟于由关键字指定的参数。例如,
! P: y6 g( K( h& f‘SQLLOAD SCott/tiger control=foo logfile=log’, 但‘不允许 sqlload scott/tiger control=foo log’,即使允许 参数 ‘log’ 的位置正确。
0 U# n- }) N# L5 V0 td:\oracle》
' g& R9 o2 F' R* i: N3 r$ K; q/ M我们可以从中看到一些基本的帮助信息,这里,我用到的是中文的WIN2000 ADV SERVER。. u; E$ z1 t/ s9 a
我们知道,SQL*LOADER只能导入纯文本,所以我们现在开始以实例来讲解其用法。5 l* m# S  I! {" y
一、已存在数据源result.csv,欲倒入ORACLE中FANCY用户下。
/ U5 @# Q' a7 v/ l2 Gresult.csv内容:
! F4 C7 Z, c! i# z1,默认 Web 站点,192.168.2.254:80:,RUNNING
+ k7 Z& g7 Y. v4 i: t8 `2,other,192.168.2.254:80:test.com,STOPPED
' B/ d2 F0 c0 z) r! V3,third,192.168.2.254:81:thirdabc.com,RUNNING
9 I2 [0 T0 q' T$ L0 J" b从中,我们看出4列,分别以逗号分隔,为变长字符串。
: d! v4 u/ H4 k
2 w& F2 q8 Q/ {+ ^  r3 M# h& |9 F9 k" _5 k  w
二、制定控制文件result.ctl
4 A) r; S: Z7 A6 iresult.ctl内容:' W# R3 A! P, O, z2 D: |4 ~5 J# M
load data
, T+ T" ^! F" l% i9 w- B- ~6 [infile ‘result.csv’. S* b+ }3 Z* |6 I9 ?3 `+ |( i
into table resultxt
5 q% w; m( b5 k* K6 o(resultid char terminated by ‘,’,- Z" b0 d$ k4 E+ W$ K; S, b
website char terminated by ‘,’,8 p: p5 P5 t% Y, H7 |
ipport char terminated by ‘,’,
3 F: ]& Z" a5 Z1 K3 C) N2 ~% Xstatus char terminated by whitespace)' F: s8 @, t' W, N; x
说明:1 v. @& X2 I; W/ g7 N
infile 指数据源文件 这里我们省略了默认的 discardfile result.dsc badfile result.bad6 o0 O% N8 H$ Z  L
into table resultxt 默认是INSERT,也可以into table resultxt APPEND为追加方式,或REPLACE# k( M7 {+ L1 v8 o% o  I# V
terminated by ‘,’ 指用逗号分隔
: w2 m2 m  Z! ~- Jterminated by whitespace 结尾以空白分隔
! ^3 Q1 L: t. f% g" Z+ K5 x' F" U三、此时我们执行加载:. |, L* E) Z! W1 \0 g
D:\》sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out( T1 H1 K) A* s' P, p
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:25:42 2002$ G# v7 X/ K6 ~+ _3 o1 U0 f
(c) Copyright 1999 Oracle Corporation. All rights reserved.
9 {  |4 R& e; f! Q# _SQL*Loader-941: 在描述表RESULTXT时出现错误
6 W$ n: N* e2 g) H# f; nORA-04043: 对象 RESULTXT 不存在2 o2 A' e. C3 H+ B+ n, u
提示出错,因为数据库没有对应的表。$ u* r9 j4 c: S5 a5 v% ]& Y3 ^
四、在数据库建立表
' @3 N8 a4 o% t3 |+ G7 y) @create table resultxt% x4 M  r+ z4 X) x0 {* K
(resultid varchar2(500),
# W$ {; G) T2 }5 Y# [8 wwebsite varchar2(500),0 {+ C4 s4 f8 W1 S- C% J" a# W% l, P
ipport varchar2(500),
" O3 X% i1 v5 M7 hstatus varchar2(500))
8 e" c- H# c9 i. W+ o// A, [& `# b0 }$ r6 g& D8 x
五、重新执行加载9 _3 i9 T1 z/ w. h* {7 p5 k
D:\》sqlldr userid=fancy/k1i7l6l8 control=result.ctl log=resulthis.out
4 D/ i  I: R8 a5 S( {SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
- m- ]# H' N4 u; K7 P! B) h(c) Copyright 1999 Oracle Corporation. All rights reserved.. H  n; D9 |8 `3 Z' z) D
达到提交点,逻辑记录计数2* `% _7 }" r* O; O* d
达到提交点,逻辑记录计数3
' k* g# l! s. s已经成功!我们可以通过日志文件来分析其过程:resulthis.out内容如下:* Y4 j9 L6 |# Z
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002( ~1 x  H& H. @1 c" a2 q
(c) Copyright 1999 Oracle Corporation. All rights reserved.
% [. x- G4 C% R5 M/ ]控制文件: result.ctl- ]( D3 M' `3 S# C
数据文件: result.csv7 u  [. _, ~' e
错误文件: result.bad. q* v5 H, o: Y
废弃文件: 未作指定2 \& x* \- \6 ^" D) T0 C& O/ ~' O
1 u. D7 ]/ R# m/ P
(可废弃所有记录)
- _1 i0 m6 h; A7 {, b: ?7 V装载数: ALL* C7 a/ U* Y7 f" K4 ?. Q
跳过数: 0
( X) s- X$ p8 t允许的错误: 50
4 V4 {  t3 y6 D, j2 Y3 }: r0 I绑定数组: 64 行,最大 65536 字节
0 k, v9 x$ \$ E  A: F继续: 未作指定" P3 ~( W; v6 T. m" R) O
所用路径: 常规9 [3 b# E. U* O+ R
表RESULTXT% L1 s: H$ T8 Z
已载入从每个逻辑记录  s+ K8 P+ C0 ~; t
插入选项对此表INSERT生效+ k+ H/ b! g. F; f2 C( K
列名 位置 长度 中止 包装数据类型
5 ]  g% [4 i3 n$ F$ E$ X6 _- {" O, S------------------------------ ---------- ----- ---- ---- ---------------------
' G# e4 Z( ^/ M; H6 f7 c. z
# G* @0 H. j( I  N; v( d3 ]( Q+ j  O; s

8 [) B) Z' e+ d+ W1 I$ t
. C3 y' V( J0 I! M5 B  ]RESULTID FIRST * , CHARACTER
: T( r% ]6 a5 v' `5 X( V  wWEBSITE NEXT * , CHARACTER
5 f( c: D& }" r! a+ }& ?; @IPPORT NEXT * , CHARACTER5 K% I$ s) m! F" s: u
STATUS NEXT * WHT CHARACTER
1 P+ v' k# k" A9 F表RESULTXT:
) D+ \5 I6 V  Y8 P/ [3 行载入成功
3 r5 w2 ]6 h" m! @% [由于数据错误, 0 行没有载入。- n0 d4 }. I- M+ e4 W- O
由于所有 WHEN 子句失败, 0 行没有载入。
' g( T2 `4 p/ M  j0 f# x" I由于所有字段都为空的, 0 行没有载入。$ }: X3 }" N& n2 N& [" X9 R5 o7 }
为结合数组分配的空间: 65016字节(63行). O$ V- f+ b# K2 H) ]9 L6 ^; S
除绑定数组外的内存空间分配: 0字节
: p- k- K1 B9 }# l% g3 L跳过的逻辑记录总数: 0
# s+ Z- f. A# `3 J读取的逻辑记录总数: 3) P9 f2 Y. h1 n  Q9 g, M  a( o
拒绝的逻辑记录总数: 0
- k$ r/ w  u( u4 p$ s废弃的逻辑记录总数: 02 R8 I5 \! b" ?; K' [* `1 f4 s
从星期二 1月 08 10:31:57 2002开始运行  O/ z- l# E# j$ k. F
在星期二 1月 08 10:32:00 2002处运行结束! V: Y5 }4 e8 Q. R
经过时间为: 00: 00: 02.70! x& S: s8 L9 H% d1 e. p/ k( X! J4 g
CPU 时间为: 00: 00: 00.10(可
, ]. W+ M# u  X; b1 F六、并发操作
! V6 F9 L8 C+ s, c7 ~# @% Bsqlldr userid=/ control=result1.ctl direct=true parallel=true
; u! N" V$ C2 d7 \. {! Z2 Dsqlldr userid=/ control=result2.ctl direct=true parallel=true% L% \; D6 L* P1 l8 K1 d3 ]
sqlldr userid=/ control=result2.ctl direct=true parallel=true
( P  p, y( c* ~, E当加载大量数据时(大约超过10GB),最好抑制日志的产生:; d3 H7 B' y9 P4 j  Q
SQL》ALTER TABLE RESULTXT nologging;+ J3 T( U! [: J' f. S
这样不产生REDO LOG,可以提高效率。然后在CONTROL文件中load data上面加一行:unrecoverable 此选项必须要与DIRECT共同应用。
: T' h* Y( r2 u; K) j, a9 i: |) z在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到1-10G就算不错了,开始可用结构 相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。0 L& [& o$ d( ~% a1 D% e7 z3 H' J
有关SQLLDR的问题
- x- d: N" O/ e' L: f控制文件:input.ctl,内容如下:
% M. H" ], B/ P/ F! |load data           --1、控制文件标识
* P3 i" S) _! \7 dinfile ‘test.txt’       --2、要输入的数据文件名为test.txt
% b: L$ M; W* happend into table test    --3、向表test中追加记录) }3 q/ B# a$ [0 ]& n) ^
fields terminated by X‘09’  --4、字段终止于X‘09’,是一个制表符(TAB)
  \  Z6 a1 r, j& V0 T/ j(id,username,password,sj)   -----定义列对应顺序
4 \4 x( G2 T2 d( ]2 m  W2 Q3 q其中append为数据装载方式,还有其他选项:
9 h  }8 s4 I; g5 A4 [# Wa、insert,为缺省方式,在数据装载开始时要求表为空
; |7 i, k, h: f" ^% Yb、append,在表中追加新记录: K" Q! P0 v! ~( z) x# _
c、replace,删除旧记录,替换成新装载的记录
, s: r" j7 O; @+ s4 T8 e. [d、truncate,同上
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-14 15:07 , Processed in 0.200004 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表