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

Oracle SqlLoader 用法

2012-12-08 09:09 1026 查看
Oracle sqlloader 是oracle提供的一个从外部文件导入数据到oracle数据库的工具,它支持多种文件格式(txt,csv), 可选择性的导入(文件的那些部分被导入),甚至可以并发性的导入一个或多个文件到一个或多个表

1. sqlloader 基本参数

用法: SQLLDR keyword=value [,keyword=value,...]

有效的关键字:

    userid -- ORACLE 用户名/口令

   control -- 控制文件名

       log -- 日志文件名

       bad -- 错误文件名

      data -- 数据文件名

   discard -- 废弃文件名

discardmax -- 允许废弃的文件的数目         (全部默认)

      skip -- 要跳过的逻辑记录的数目  (默认 0)

      load -- 要加载的逻辑记录的数目  (全部默认)

    errors -- 允许的错误的数目         (默认 50)

      rows -- 常规路径绑定数组中或直接路径保存数据间的行数(默认: 常规路径 64, 所有直接路径)

  bindsize -- 常规路径绑定数组的大小 (以字节计)  (默认 256000)

    silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)

    direct -- 使用直接路径                     (默认 FALSE)

   parfile -- 参数文件: 包含参数说明的文件的名称

  parallel -- 执行并行加载                    (默认 FALSE)

      file -- 要从以下对象中分配区的文件

2. 基本用法

sqlldr userid=scott/scott@oracle control=ctl/upload.ctl data=data/upload.txt bad=bad/upload.%date%.bad discard=discard/upload.%date%.discard log=log/upload.%date%.log

注意,这里允许的最大的错误行数默认是50

默认跳过的行数是0,如果你有文件头或列名标识,请跳过这些行skip=n

 

性能参数

a.) direct=true 直接插入oracle数据文件,跳过SGA, 如果导入表有主键,可能导致主键unsafe, 对于cluseted table不适用。$ORACLE_HOME/rdbms/admin/catldr.sql需要可执行

b.)关闭目标表上所有索引及约束

c.) rows=128指定数据提交到数据库的行数,与 bindsize=512000相关,更少次数的提交可以提供更好的性能

d.)parallel=true 依赖于 direct=true,使并发导入。

e.)大文件分割小文件,使用append模式追加到同一表,并使用外部多线程程序调用slqloader

f.)提供fixed length数据而不是分割符类数据,可以减少数据解析时间

g.)关闭数据库归档,alter table mytable nologging.

f.)关闭数据库redo日志 sqlldr usid=xx unrecoverable data=xxx 

 

注意问题 (Keyword: single-byte, mutiple-byte, Character/Byte Semantic CHAR/NCHAR/VARCHAR/VARCHAR2/NVARCHAR2)

数据文件的导入有两种一种按位置分割(只能按字节,不能按字符,在多语言的时候,输入文件应该按字节计算好位置,否则倒入的位置会不正确(UTF8 格式文件,一个汉字2个字节,UltraEdit打开显示字节长度,notepad++显示字符长度)),另外就是按分割符(列中的内容不能包含该分割符)

关于字段长度的问题CHAR/NCHAR 最大2000字节,VARCHAR 是 VARCHAR2的同义词 VARCHAR2/NVACHAR2 最大4000字节 , N 表示以字符的方式存储

在DB设置为UTF8时 select * from nls_database_parameters

VARCHAR2(1) => 只能插入一个字节,不能插入汉字

VARCHAR2(2) => DB设置为GBK,能插入一个汉字 (一个汉子两个字字节)

VARCHAR2(3) => 能插入一个汉字 (UTF8 , 默认一个汉字站3个字节)

VARCHAR2(1 CHAR) => 能存入一个汉字 这种情况下 等同 NVARCHAR(1)

VARCHAR2(4000 CHAR) => 最多能存入 1333 汉字, 因为 他最多正能存4000 byte,

另外 可以使用LENGTHB and LENGTH  和 SUBSTRB and SUBSTR 求字节/字符长度,和字节/字符的substr.

 

按分割符方式

LOAD DATA


INFILE'E:\test\data.tmp'


BADFILE'E:\test\data.bad'


DISCARDFILE'E:\test\data.dsc'


DISCARDMAX1000




APPEND|INSERT|(REPLACE/TRUNCATE)


INTOTABLE "TB_TEST"


FIELDS TERMINATEDBY
'|'


TRAILING NULLCOLS


  (


  USER_ID,


  USER_NAME,


  REG_TIME 
DATE(20) "YYYY-MM-DD HH24:MI:SS"


   )

 按位置方式

LOAD DATA


INFILE'E:\test\data.tmp'


BADFILE'E:\test\data.bad'


DISCARDFILE'E:\test\data.dsc'


DISCARDMAX1000




APPEND


INTOTABLE "TB_TEST"


TRAILING NULLCOLS


  (


  USER_NAME POSITION(1,3)


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