65
第5章  SQL*Loader 加载数据
看到这里,我想大家对于SQL*Loader 的体系结构就比较了解了,当然理论是理论,实际操作的时候保不齐还会碰到问题,因此我们还需要多多实践,才能加强理论的认识啊。  5.3  一千零一十一个怎么办
5.3.1  给我的是个Excel 文件怎么办
如果碰到的是这个问题,我首先想说的是,你运气不错!众所周知,.xls 文件单个Sheet 最大行数不超过65536行,这起码说明你将要处理的数据量不大。
一般处理Excel 数据,最常用的方式是将其保存为CSV (Comma Separated Values ,逗号分隔值)格式文件,单击“文件”→“另存为”命令,在“保存类型”下拉列表框中选择CSV ,如图5-1所示。
图5-1  “另存为”对话框
然后,即可按照5.1节中演示的方式执行导入。
67
第5章  SQL*Loader 加载数据 ALLEN
SALESMAN  2891 WARD
SALESMAN  3128 KING  PRESIDENT  2523
示例代码保存为数据文件ldr_case3.dat 。
按照专业的叫法,这是定长字符串,不要紧的,SQLLDR 中处理定长字符串也轻而易举。针对此例,我们将控制文件修改如下: LOAD DATA
INFILE ldr_case3.dat
TRUNCATE INTO TABLE BONUS
(
ENAME position(1:5),
JOB position(7:15),
SAL position(17:20)
)
示例代码保存为控制文件l 。
position 关键字用来指定列的开始和结束位置,如JOB position (7:15)是指从第7个字符开始截止到第15个字符作为ENAME 列的列值。position 的写法也很灵活,要实现上述功能还可以换成下列几种形式:
l  position(*+2:15):直接指定数值的方式叫作绝对偏移量,如果使用*号,专业名词
叫相对偏移量,表示上一个字段从哪里结束,这次就从哪里开始,相对偏移量也可以再做运算,比如po
sition(*+2:15)就表示从上次结束的位置+2的地方开始。
l  position(*) char(9):这种相对偏移量+类型和长度的优势在于,你只需要为第一列
指定开始位置,其他列只需要指定列长度就可以了,实际使用中比较省事。
执行SQLLDR 命令: F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE3.CTL
SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 16:56:20 2009
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
达到提交点 - 逻辑记录计数 3
达到提交点 - 逻辑记录计数 4
SQL*Plus 中查看导入结果: SQL> SELECT * FROM BONUS;
ENAME    JOB          SAL
COMM ---------- ---------  ----------
-
---------
SMITH    CLEAK              3904
ALLEN    SALESMAN          2891
WARD    SALESMAN          3128
KING      PRESIDENT          2523 5.3.5  数据文件中的列比要导入的表中列少怎么办
提出这样的问题,说明你没有认真看我们前面的示例,对,前面你睡着了,OK ,那就清醒一下,重新查看一下表结构:
SQL> DESC BONUS;
名称      是否为空?  类型
PDF created with pdfFactory Pro trial version www.pdffactory
69
第5章  SQL*Loader 加载数据 SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 17:13:59 2009
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
达到提交点 - 逻辑记录计数 3
达到提交点 - 逻辑记录计数 4
SQL*Plus 中查看导入结果: SQL> SELECT * FROM BONUS;
ENAME    JOB
SAL      COMM ----------  --------------------
-
---------  ---------- SMITH      CLEAK
3904        3 ALLEN      SALESMAN
2891        2 WARD        SALESMAN
3128        3 KING        PRESIDENT    2523        2
这里COMM 列的值根据SAL 列值而定,我们通过一个SQL 中的函数substr 取SAL 值的第一列,赋予COMM 列,当然这只是一个示例,DBA 可以根据实际需求进行适当的修改,通过SQL 中的函数可以实现很多很有意思的转换,也许能够为你省下很大力气,而且如果现有函数无法实现,甚至可以通过PL/SQL 编写自定义的函数,然后在SQLLDR 的控制文件中调用,调用方式与系统自带函数方式完全相同,这样就可以根据需求对要加载的列做更灵活的处理。
5.3.6  数据文件中的列比要导入的表中列多怎么办
如果数据文件中的列比要导入的表中的列少,处理的时候可能麻烦些,多了反倒更简单,针对不同情况,一般有以下两种处理方式:
方式一:修改数据文件,将多余的数据删除,不过以这种方式处理,小数据量时还算可行,一旦数据文件较大,几百兆甚至上千兆,修改数据文件耗时耗力,这时我们就需要Plan B 。
方式二:比如,数据文件如下(同样是基于只做演示的目的,这里三思就不真的提供几百兆甚至上千兆的数据了,不然出版社非把我活吞了不可): SMITH
7369  CLERK      800  20 ALLEN
7499  SALESMAN  1600  30 WARD
7521  SALESMAN  1250  30 JONES
7566  MANAGER    2975  20 MARTIN
truncate多张表加逗号吗7654  SALESMAN  1250  30 BLAKE
7698  MANAGER    2850  30 CLARK
7782  MANAGER    2450  10 KING
7839  PRESIDENT  5000  10 TURNER
7844  SALESMAN  1500  30 JAMES
7900  CLERK      950  30 FORD
7902  ANALYST    3000  20 MILLER  7934  CLERK      1300  10
示例代码保存为数据文件ldr_case6.dat 。
我们希望导入第1、3、4列而跳过2、5两列(注意这里指的不是字符列),创建控制文件如下:
LOAD DATA
INFILE ldr_case6.dat
PDF created with pdfFactory Pro trial version www.pdffactory

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。