SQL*Loader加载数据

加载有分割符的数据

数据文件

示例数据文件(保存为:oracledata.data):

1
2
3
4
"TE,SE","D,ASA",1520 //","必须在一个字符串中,比如:"D,ASA"是正确的.
TES,"DAT,E",1598
"EW,W",TET,1998
DSEW,"E,WTW",1580

控制文件

示例控制文件(另存为:ldr_case.ctl)

1
2
3
4
5
6
7
LOAD DATA
INFILE oracledata.data
TRUNCATE INTO TABLE BONUS
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
//OPTIONALLY ENCLOSED BY 参数指明界定符.
(ENAME,JOB,SAL)
BEGINDATA

–>之后就是执行命令:

1
2
3
4
sqlldr SCOTT/TIGER CONTROL=ldr_case.ctl
//然后
sqlplus SCOTT/TIGER
SELECT * FROM BONUS;

导入没有分割符的数据

示例数据

示例数据(保存为:oracledata1.data):

1
2
3
4
SMITH   CLEAK           3904
ALLEN   SALESMAN        2891
WARDA   SALESMAN        3128
KINGA   PRESIDENT       2523

控制文件

控制文件如下(另存为:ldr_case1.ctl):

1
2
3
4
5
6
7
8
9
10
11
12
LOAD DATA
INFILE oracledata1.data
TRUNCATE INTO TABLE BONUS
(
ENAME position(1:5),//1
JOB position(7:15),
SAL position(17:20)//position可以用于定位数据,还有以下格式:
//position(*+2:15):表示从(1)结束之后增加两个字符.
//position(*)char(9):相对偏移量+类型和长度的优势在于,
//你只需要为第一列指定开始位置,其他列只需要指定列长度就可以了,实际使用比较方便
)
BEGINDATA

接下来的事情,还用我说嘛?

Oracle LOGO
image-1829

假如导入数据的列,比表中的数据少怎么办

示例数据

表结构:

——————————-
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
SAL NUMBER
COMM NUMBER
——————————-

仔细看来,少一列是没有任何问题的.

此处就不演示怎么插入少一列的数据了.

设置默认值:只需要修改控制文件

示例数据(保存为:oracledata2.data):

1
2
3
4
SMITH   CLEAK           3904
ALLEN   SALESMAN        2891
WARDA   SALESMAN        3128
KINGA   PRESIDENT       2523

控制文件

控制文件如下(另存为:ldr_case2.ctl):

1
2
3
4
5
6
7
8
9
10
LOAD DATA
INFILE oracledata1.data
TRUNCATE INTO TABLE BONUS
(
ENAME position(1:5),//1
JOB position(7:15),
SAL position(17:20),
COMM "0" //设置默认值.
)
BEGINDATA

当然也可以通过SAL列的值来设置COMM列的值,只需要修改控制文件:

1
2
3
4
5
6
7
8
9
10
LOAD DATA
INFILE oracledata1.data
TRUNCATE INTO TABLE BONUS
(
ENAME position(1:5),//1
JOB position(7:15),
SAL position(17:20),
COMM "substr(:SAL,1,1)"
)
BEGINDATA

其余的就跟上述一样了.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据