load data
infile *
into table IMPUT_TAB
replace
fields terminated by ','
trailing nullcols
(deptno "case when :deptno <= 20 then 0 else 1 end",
dname ,
loc "upper(:loc)",--运用函数,使导入的数据变成大写字母
last_date date 'dd/mm/yyyy',--设置导入日期数据,并说明数据文件中的日期格式
entir_line ":deptno||:dname||:loc||:last_date",
seq sequence(1,1)--"MY_SEQUENCE.NEXTVAL"中MY_SEQUENCE为在数据库中创建的序列名称.
)
begindata
10,sales,vir,1/5/2000
20,account,virginia,21/6/1999
30,consulting,vig,5/1/2000
40,finance,vig,15/3/2001
/*
1.sequence(1,1)第一个1表示此方法从1开始,第二个1表示步伐。
2.对于第一个1,还可以更换成count,计算表中的记录数后,加1开始算sequence。
3.还有max,取表中该字段的最大值后加1开始计算sequence、
4.如果使用自己创建的sequence时(MY_SEQUENCE.NEXTVAL),目前在内联数据文件
中测试通过,不过在外部数据文件的情况下测试失败。
*/
对应的导入表的定义语句如下:
SQL> select dbms_metadata.get_ddl('TABLE','IMPUT_TAB') from dual;
CREATE TABLE "SCOTT"."IMPUT_TAB"
( "DEPTNO" VARCHAR2(10),
"DNAME" VARCHAR2(10),
"LOC" VARCHAR2(10),
"LAST_DATE" DATE,
"ENTIR_LINE" VARCHAR2(30),
"SEQ" NUMBER(20,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS";
/
说明:
通常在导入时没有运用函数时,
1.sqlldr构建的insert语句非常简单,拿上面例子拉说,其构建的insert语句是:insert into IMPUT_TAB(DEPTNO,DNAME,LOC,LAST_DATE,ENTIR_LINE,SEQ)values(:DEPTNO,:DNAME,:LOC,:LAST_DATE,:ENTIR_LINE,:SEQ);为这些列建绑定变量名。
2.然后sqlldr分析该输入流,并给绑定变量分配值,再执行该insert语句。
但当我们使用函数后的sqlldr将把它们与insert语句合并。在以上的例子中,sqlldr构建的insert语句是:
insert into IMPUT_TAB(DEPTNO,DNAME,LOC,LAST_DATE,ENTIR_LINE,SEQ)values(:DEPTNO,:DNAME,upper(:LOC),:LAST_DATE,:deptno||:dname||:loc||:last_date,:SEQ);
然后它将准备并绑定输入到该语句,并执行。
infile *
into table IMPUT_TAB
replace
fields terminated by ','
trailing nullcols
(deptno "case when :deptno <= 20 then 0 else 1 end",
dname ,
loc "upper(:loc)",--运用函数,使导入的数据变成大写字母
last_date date 'dd/mm/yyyy',--设置导入日期数据,并说明数据文件中的日期格式
entir_line ":deptno||:dname||:loc||:last_date",
seq sequence(1,1)--"MY_SEQUENCE.NEXTVAL"中MY_SEQUENCE为在数据库中创建的序列名称.
)
begindata
10,sales,vir,1/5/2000
20,account,virginia,21/6/1999
30,consulting,vig,5/1/2000
40,finance,vig,15/3/2001
/*
1.sequence(1,1)第一个1表示此方法从1开始,第二个1表示步伐。
2.对于第一个1,还可以更换成count,计算表中的记录数后,加1开始算sequence。
3.还有max,取表中该字段的最大值后加1开始计算sequence、
4.如果使用自己创建的sequence时(MY_SEQUENCE.NEXTVAL),目前在内联数据文件
中测试通过,不过在外部数据文件的情况下测试失败。
*/
对应的导入表的定义语句如下:
SQL> select dbms_metadata.get_ddl('TABLE','IMPUT_TAB') from dual;
CREATE TABLE "SCOTT"."IMPUT_TAB"
( "DEPTNO" VARCHAR2(10),
"DNAME" VARCHAR2(10),
"LOC" VARCHAR2(10),
"LAST_DATE" DATE,
"ENTIR_LINE" VARCHAR2(30),
"SEQ" NUMBER(20,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS";
/
说明:
通常在导入时没有运用函数时,
1.sqlldr构建的insert语句非常简单,拿上面例子拉说,其构建的insert语句是:insert into IMPUT_TAB(DEPTNO,DNAME,LOC,LAST_DATE,ENTIR_LINE,SEQ)values(:DEPTNO,:DNAME,:LOC,:LAST_DATE,:ENTIR_LINE,:SEQ);为这些列建绑定变量名。
2.然后sqlldr分析该输入流,并给绑定变量分配值,再执行该insert语句。
但当我们使用函数后的sqlldr将把它们与insert语句合并。在以上的例子中,sqlldr构建的insert语句是:
insert into IMPUT_TAB(DEPTNO,DNAME,LOC,LAST_DATE,ENTIR_LINE,SEQ)values(:DEPTNO,:DNAME,upper(:LOC),:LAST_DATE,:deptno||:dname||:loc||:last_date,:SEQ);
然后它将准备并绑定输入到该语句,并执行。