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)"
?
数据文件中的列比要导入的表中列多怎么办?
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)