如果数据文件中的列比要导入的表中的列少,处理的时候可能麻烦些,多了反倒更简单,针对不同情况,一般有以下两种处理方式:
方式一:修改数据文件,将多余的数据删除,不过以这种方式处理,小数据量时还算可行,一旦数据文件较大,几百兆甚至上千兆,修改数据文件耗时耗力,这时我们就需要Plan B。
方式二:比如,数据文件如下:
1. SMITH 7369 CLERK 800 20
2. ALLEN 7499 SALESMAN 1600 30
3. WARD 7521 SALESMAN 1250 30
4. JONES 7566 MANAGER 2975 20
5. MARTIN 7654 SALESMAN 1250 30
6. BLAKE 7698 MANAGER 2850 30
7. CLARK 7782 MANAGER 2450 10
8. KING 7839 PRESIDENT 5000 10
9. TURNER 7844 SALESMAN 1500 30
10. JAMES 7900 CLERK 950 30
11. FORD 7902 ANALYST 3000 20
12. MILLER 7934 CLERK 1300 10
示例代码保存为数据文件ldr_case6.dat。我们希望导入第1、3、4列而跳过2、5两列(注意这里指的不是字符列),创建控制文件如下:
1. LOAD DATA
2. INFILE ldr_case6.dat
3. TRUNCATE INTO TABLE BONUS
4. (
5. ENAME position(1:6),
6. TCOL FILLER position(8:11),
7. JOB position(13:21),
8. SAL position(23:26)
9. )
示例代码保存为控制文件ldr_case6.ctl。SQLLDR的控制文件中对列定义时支持FILLER关键字,可以用来指定过滤列,在上述控制文件中,我们就使用该关键字来过滤列,相当于第8到第11列之间的数据不导入。事实上由于此处为定长字串,我们在控制文件中指定的position参数,已经限定了读取的内容,你甚至可以删除控制文件中TCOL FILLER position(8:11)那行。执行SQLLDR命令:
1. F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE6.CTL
2. SQL*Loader: Release 10.2.0.1.0 - Production on
3. 星期三 3月 11 23:13:33 2009
4. Copyright © 1982, 2005, Oracle. All rights reserved.
5. 达到提交点 - 逻辑记录计数 11
6. 达到提交点 - 逻辑记录计数 12
SQL*Plus中查看导入结果:
1. SQL> SELECT * FROM BONUS;
2. ENAME JOB SAL COMM
3. ---------- --------- --------- ----------
4. SMITH CLERK 800
5. ALLEN SALESMAN 1600
6. WARD SALESMAN 1250
7. JONES MANAGER 2975
8. MARTIN SALESMAN 1250
9. BLAKE MANAGER 2850
10. CLARK MANAGER 2450
11. KING PRESIDENT 5000
12. TURNER SALESMAN 1500
13. JAMES CLERK 950
14. FORD ANALYST 3000
15. MILLER CLERK 1300
结果符合要求,不过,如果数据文件中字符串不是定长格式,而是通过分隔符来处理的,那控制文件中就需要注意,如数据文件如下:
1. SMITH,7369,CLERK,800,20
2. ALLEN,7499,SALESMAN,1600,30
3. WARD,7521,SALESMAN,1250,30
4. JONES,7566,MANAGER,2975,20
5. MARTIN,7654,SALESMAN,1250,30
6. BLAKE,7698,MANAGER,2850,30
7. CLARK,7782,MANAGER,2450,10
8. KING,7839,PRESIDENT,5000,10
9. TURNER,7844,SALESMAN,1500,30
10. JAMES,7900,CLERK,950,30
11. FORD,7902,ANALYST,3000,20
12. MILLER,7934,CLERK,1300,10
示例代码保存为数据文件ldr_case7.dat。创建控制文件,此时控制文件中必须指定FILLER,不然列值就有可能不对应。例如,创建控制文件如下:
1. LOAD DATA
2. INFILE ldr_case7.dat
3. TRUNCATE INTO TABLE BONUS
4. FIELDS TERMINATED BY “,”
5. (ENAME,TCOL ,JOB,SAL)
示例代码保存为控制文件ldr_case7.ctl。执行SQLLDR命令:
1. F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE7.CTL
2. SQL*Loader: Release 10.2.0.1.0 - Production on
3. 星期三 3月 11 23:27:21 2009
4. Copyright © 1982, 2005, Oracle. All rights reserved.
5. 达到提交点 - 逻辑记录计数 11
6. 达到提交点 - 逻辑记录计数 12
SQL*Plus中查看导入结果:
SQL> SELECT * FROM BONUS;
ENAME JOB SAL COMM
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
KING PRESIDENT 5000
TURNER SALESMAN 1500
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300