加载有分割符的数据
数据文件
示例数据文件(保存为: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 |
接下来的事情,还用我说嘛?
假如导入数据的列,比表中的数据少怎么办
示例数据
表结构:
——————————-
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 |
其余的就跟上述一样了.