Oracle SqlLoader 用法

本文深入探讨了Oracle SQLLoader的基本用法、性能参数及其解决常见问题的方法,包括导入数据时的错误处理、性能优化策略和不同数据类型的支持。通过实例展示了如何高效地将外部文件数据导入Oracle数据库,同时提供了针对不同场景的最佳实践建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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'
DISCARDMAX
1000

APPEND|INSERT|(REPLACE/TRUNCATE)
INTOTABLE "TB_TEST"
FIELDS TERMINATED
BY '|'
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'
DISCARDMAX
1000

APPEND
INTOTABLE "TB_TEST"
TRAILING NULLCOLS
  (

  
USER_NAME POSITION(1,3)
   )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值