当前位置: 代码迷 >> SQL >> SQL*Loader - 十万个怎么处理 系列一
  详细解决方案

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

热度:283   发布时间:2016-05-05 15:05:17.0
SQL*Loader - 十万个怎么办 系列一

给我的是一个Excel文件怎么办?

一般处理Excel数据,最常用的方式是将其保存为CVS(Comma Separated Values,逗号分隔值)格式文件;

单击“文件” -> “另存为”,在“保存类型”下拉框中选择CVS。

然后按照《认识 SQL*Loder》的示例执行导入。

?

要加载的文件不是以逗号分隔怎么办?

  • 修改数据文件,将分隔符替换为逗号
  • 修改控制文件,将FIELDS TERMINATED BY 的值修改为实际的分隔符

?

要加载的数据中包含分隔符怎么办?

向BONUS插入如下数据:

SMITH,CLEAK,3904ALEEN,"SALER,M",2891WARD,"SALER,""S""",3128KING,PRESIDENT,2523
FILEDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'

OPTIONALLY ENCLOSED BY 参数指明定界符为双引号(CVS默认定界符就是双引号)。

?

数据文件没有分隔符怎么办?

提供如下数据:

SMITH      CLEAK         3904ALEEN      SALERMAN  2891WARD      SALERMAN   3128KING        PRESIDENT  2523

这就是定长字符串,SQLLDR中处理定长字符串:

LOAD DATAINFILE ldr_case3.ctlTRUNCATE INTO TABLE BONUS(ENAME position(1:5),JOB position(7:15),SAL position(17:20))

position的用户相当灵活:

  • position(*+2:15) - 直接指定数值的方式叫做绝对偏移量;如果使用*号,专业名词叫相对偏移量,表示上一个字段从哪里结束,这次就从哪里开始,相对偏移量也可以再做运算
  • position(*)char(9) - 这种相对偏移量+类型和长度的优势在于,只需要为第一列指定开始位置,其他列只需要指定长度就可以了。

数据文件中的列比要导入的表中列少怎么办?

列少不怕,关键要看控制文件中的配置;

考虑一种情况:如果缺少的列必须赋值怎么办?可以修改控制文件,直接指定COMM列,并赋初始值

LOAD DATAINFILE ldr_case3.ctlTRUNCATE INTO TABLE BONUS(ENAME position(1:5),JOB position(7:15),SAL position(17:20),COMM "0")

COMM的值可以根据SAL列值而定,通过一个SQL中的函数substr取SAL值的第一列,赋予COMM列。

COMM "substr(:SAL, 1, 1)"

?

数据文件中的列比要导入的表中列多怎么办?

  1. 修改数据文件,将多余的数据删除,不过这种处理方式,小数据量时还算可行,一旦数据文件较大,几百兆甚至上千兆,修改数据文件耗时耗力。
  2. 提供如下数据文件
SMITH 7369 CLERK        800    20ALLEN 7499 SALESMAN 1600  30WARD 7521 SALESMAN 1250  30JONES 7566 MANAGER  2975  20

?需要导入第1、3、4列,而跳过第2、5列

LOAD DATAINFILE ldr_case3.ctlTRUNCATE INTO TABLE BONUS(ENAME position(1:5),TCOLFOLLER position(8:11),JOB position(7:15),SAL position(17:20))

FILLER, 可以用来过滤列,相当于第8到第11列之间的数据不导入。

?

如果提供如下数据:

SMITH,7369,CLERK,800,20ALLEN,7499,SALESMAN,1600,30WARD,7521,SALESMAN,1250,30JONES,7566,MANAGER,2975,20

则处理:

LOAD DATAINFILE ldr_case3.ctlTRUNCATE INTO TABLE BONUSFIELDS TERMINATED BY ","(ENAME,TCOL FILLER,JOB,SAL)

此控制文件中必须指定FILLER,不然列值就可能不对应。

?

?

提供多个数据文件,要导入同一张表怎么办?

对于逻辑比较复杂的系统,导出的数据源可能源于多个系统,因此提供给DBA的也是多个数据文件。

不需要执行多次加载,只要在控制文件中做适当配置即可。

注意:提供的数据文件中的数据存放格式必须完全相同

?

数据文件ldr_case8_1.dat

10, SMITH, SALES,MANAGER11, ALLEN, TECH,MANAGER16, BLAKE, HR,MANAGER

数据文件ldr_case8_2.dat

12, WARD, SERVICE,MANAGER13, TURNER, SELLS,DIRECTOR15, JAMES, HR,DIRECTOR

数据文件ldr_case8_3.dat

17, MILLER, PRESIDENT,

导入数据:

LOAD DATAINFILE ldr_case1.ctlINFILE ldr_case2.ctlINFILE ldr_case3.ctlTRUNCATE INTO TABLE MANAGERFIELD TERMINATED BY ","(MGRNO, NAME, JOB, REMARK)
  相关解决方案