SQL*Loader - 十万个怎么办 系列一

同一个数据文件,要导入不同表怎么办?

控制文件提供了多种逻辑判断方式,只要能把逻辑清晰地描述出来,SQL*Loader就能按照指定的逻辑执行加载。

BON SMITH CLERK 3904
BON ALLEN SALER,M 2891
MGR 10 SMITH SALES MANAGER
MGR 11 ALLEN.W TECH MANAGER
TMP ALLEN 7499 SALESMAN 1600 30

需求:以MGR开头的记录导入MANAGER表,以BON开头的记录导入BONUS表,其他记录作废

LOAD DATA
INFILE ldr_case9.dat
DISCARDFILE ldr_case9.dsc
TRUNCATE
 INTO TABLE BONUS
  WHEN TAB='BON'
  ( TAB FILLER POSITION(1:3),
    ENAME POSITION(5:9),
    JOB POSITION(*+1:18),
    SAL POSITION(*+1)
  )
  INTO TABLE MANAGER
  WHEN TAB='MGR'
  ( TAB FILLER POSITION(1:3),
    MGRNO POSITION(4:5),
    MNAME POSITION(7:13),
    JOB POSITION(*+1)
  ) 

DISCARDFILE参数,以生成不满足加载条件的废弃文件。

数据文件前N行不想导入怎么办?

SQLLDR有一个参数SKIP,满足此类需求:

SQLLDR SOCTT/TIGGER CONTROL=ldr_case10.ctl SKIP=3 

SQLLDR还有一个参数LOAD参数:只加载第**~第**行的记录

需求:加载第4~9行的记录

SQLLDR SOCTT/TIGGER CONTROL=ldr_case10.ctl SKIP=3 LOAD=6
 

要加载的数据中有换行符怎么办?

手工指定换行符

“\”是默认转义符,指定该转义符后SQLLDR就将将“\n”识别成普通字符。

10, SMITH, SALES MANAGER, This is SMITH. \n He is a Sales Manager.
11, ALLEN, TECH MANAGER, This is ALLEN. \n He is a Tech Manage.

加载remark列的数据,将用户指定的额“\n”字符替换为chr(10), 即标准换行符。

LOAD DATA
INFILE ldr_case11.dat
TRUNCATE INTO TABLE MANAGER
FIELDS TERMINATE BY ","
( MGRNO, MNAME, JOB,
   REMARK "replace (:remark, '\\n', chr(10))"
)

指定FIX属性处理换行符(定长数据文件专用)

10 SMITH SALES MANAGER This is SMITH.
He is a Sales Manager.
11 ALLEN TECH MANAGER This is ALLEN.
He is a Tech Manage.
LOAD DATA
INFILE ldr_case11_2.dat "fix 68"
TRUNCATE INTO TABLE MANAGER
( MGRNO POSITION(1:2), 
  MNAME POSITION(*+1:10), 
  JOB POSITION(*+1:24),
  REMARK POSITION(*+1:65)
)

先通过FIX属性指定每行的长度(这里每行68个字符,包括换行符在内),到了指定长度就换行,不管中间有没有换行符。

仅用于定长字符串的数据文件。

指定VAR属性处理换行符(行头部标识换行)

猜你喜欢

转载自pengwei-daily.iteye.com/blog/1395436