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小时内删除。
发表评论