欢迎来到福编程网,本站提供各种互联网专业知识!
您的位置:网站首页 > 数据库 > MsSql

SqlLoader怎么使用

发布时间:2015-12-13 作者:蓝紫 来源:转载
SQL*Loader(SQLLDR)是Oracle的高速批量数据加载工具。这是一个非常有用的工具,可用于多种平面文件格式向Oralce数据库中加载数据,本文给大家分享sqlloader怎么使用的相关资料,感兴趣的朋友一起学习吧

SQL*Loader(SQLLDR)是Oracle的高速批量数据加载工具。这是一个非常有用的工具,可用于多种平面文件格式向Oralce数据库中加载数据。今天看了申请了*loader的使用,自己小试了下,记录在这

1、假设要插入数据的表ftest,字段是(id,username,password,sj)

2、导入表的数据 以txt格式存储,名为data.txt

代码
  1. 1 f f 2010-8-19
  2. 2 f1 f1 2010-8-19
  3. 3 f2 f2 2010-8-19
  4. 4 f3 f3 2010-8-19
  5. 5 f4 f4 2010-8-19

3、写控制文件,格式为ctl,命名为cont.ctl 内容如下:

代码
  1. load data
  2. infile 'c:data.txt'
  3. insert into table ftest
  4. fields terminated by " "
  5. (id,username,password,sj)

注:如果表中没有数据就用insert,有数据就用append,删除旧数据插入新的数据用replace或truncate

4 在cmd命令窗口中执行

代码
  1. sqlldr fyzh/fyzh control=c:cont.ctl data=c:data.txt

5 在plsql中查看表ftest

查看已成功插入。

重新学习sqlldr

sqlldr导入数据的一个最简单例子:

代码
  1. load data
  2. infile * --告诉sqlldr要加载的数据就包含在控制文件本身
  3. into table dept --加载到哪个表
  4. fields terminated by ',' --数据加载形式应该是逗号分隔的值
  5. (deptno,dname,loc) --所要加载的列
  6. begindata --告诉sqlldr后面的行市要加载到dept表的数据
  7. 10,Sales,Virginia
  8. 20,Accounting,Virginia
  9. 30,Consulting,Virginia
  10. 40,Finance,Virginia
  11. create table dept
  12. (deptno number(2) constraint dept_pk primary key,
  13. dname varchar2(14),
  14. loc varchar2(13)
  15. )
  16. sqlldr userid=gwm/gwm@fgisdb control=c:demol.ctl
  17. select * from dept;
  18. 1 10 Sales Virginia
  19. 2 20 Accounting Virginia
  20. 3 30 Consulting Virginia
  21. 4 40 Finance Virginia

sqlldr导入的四种加载方式:

APPEND :原先的表有数据 就加在后面

INSERT:装载空表 如果原先的表有数据 sqlloader会停止 默认值

REPLACE :原先的表有数据 原先的数据会全部删除

TRUNCATE :指定的内容和replace的相同 会用truncate语句删除现存数据

用SQLLDR加载数据的FAQ

1、如何加载定界数据

1)定界数据即用某个特殊字符分隔的数据,可能用引号括起,这是当前平面文件最常见的数据格式。

对于定界数据,最常用的格式是逗号分隔值格式。采用这种文件格式,数据中的每个字段与下一个字段用一个逗号分隔。文本串可以用引号括起,这样就串本身包含逗号。如果串还必须包含引号,一般约定是使用两个引号。加载定界数据,相应的典型控制文件与前面例子相似,但是fields terminated by子句通常如下指定:

代码
  1. fields terminated by ',' optionally enclose by '"'

它指定用逗号分隔数据字段,每个字段可以用双引号括起。如果把这个控制文件的最后部分修改如下:

代码
  1. fields terminated by ',' optionally enclosed by '"'
  2. (deptno,dname,loc)
  3. begindata
  4. 10,Sales,"Virginia,USA"
  5. 20,Accounting,"Va,""USA"""
  6. 30,Consulting,Virginia
  7. 40,Finance,Virginia
  8. select * from dept
  9. 1 10 Sales Virginia,USA
  10. 2 20 Accounting Va,"USA"
  11. 3 30 Consulting Virginia
  12. 4 40 Finance Virginia

2)另一种常用的格式是制表符定界数据。有两种方法使用terminated by子句来加载这种数据:

terminated by X'09' --使用十六进制格式的制表符;若用ASCII,制表符应该是9

代码
  1. terminated by whitespace
  2. --使用terminated by whitespace
  3. load data
  4. infile *
  5. into table dept
  6. replace
  7. fields terminated by whitespace
  8. (deptno,dname,loc)
  9. begindata
  10. 10 Sales Virginia
  11. select * from dept;
  12. 1 10 Sales Virginia
  13. --使用terminated by X'09'
  14. load data
  15. infile *
  16. into table dept
  17. replace
  18. fields terminated by X'09'
  19. (deptno,dname,loc)
  20. begindata
  21. 10 Sales Virginia
  22. select * from dept;
  23. 1 10

Sales --因为一旦遇到一个制表符就会输出一个值。

因此,将10赋给deptno,dname得到了null,因为在第一个制表符和第二个制表符之间没有数据

3)sqlldr的filler关键字使用

如跳过制表符

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. fields terminated by X'09'
  6. (deptno,dummy1 filler,dname,dummy2 filler,loc)
  7. begindata
  8. 10 Sales Virginia
  9. select * from dept;
  10. 1 10 Sales Virginia

2、如何加载固定格式数据

要加载定宽的固定位置数据,将会在控制文件中使用position关键字。

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. (deptno position(1:2),
  6. dname position(3:16),
  7. loc position(17:29)
  8. )
  9. begindata
  10. 10Accounting Virginia,USA
  11. select * from dept;
  12. 1 10 Accounting Virginia,USA

这个控制文件没有使用terminated by子句;而是使用了position来告诉sqlldr 字段从哪里开始,到哪里结束。

对于position,我们可以使用重叠的位置,可以在记录中来回反复。如下修改dept表:

代码
  1. alter table dept add entire_line varchar(29);

并使用如下控制文件:

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. (deptno position(1:2),
  6. dname position(3:16),
  7. loc position(17:29),
  8. entire_line position(1:29)
  9. )
  10. begindata
  11. 10Accounting Virginia,USA
  12. select * from dept;
  13. 1 10 Accounting Virginia,USA 10Accounting
  14. Virginia,USA

使用position时,可以使用相对偏移量,也可以使用绝对偏移量。前面的例子使用了绝对偏移量,明确指定字段从哪开始,从哪结束,也可以将

前面的控制文件改写如下:

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. (deptno position(1:2),
  6. dname position(*:16),
  7. loc position(*:29),
  8. entire_line position(1:29)
  9. )
  10. begindata
  11. 10Accounting
  12. Virginia,USA

*指示控制文件得出上一个字段在哪里结束。因此,在这种情况下,(*:16)与(3:16)是一样的。注意,控制文件可以混合使用相对位置和绝对位置。

另外,使用*表示法时,可以把它与偏移量相加。例如dname从deptno结束之后的;两个字符开始,可以使用(*+2:16),即相当于(5:16).

position子句中的结束位置必须是数据结束的绝对列位置。有时,可能指定每个字段的长度更为容易,特别是如果这些字段是连续的。采用这种

方式,只需告诉sqlldr:记录从第一个字节开始,然后指定每个字段的长度。如下:

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. (deptno position(1) char(2),
  6. dname position(*) char(14),
  7. loc position(*) char(13),
  8. entire_line position(1) char(29)
  9. )
  10. begindata
  11. 10Accounting Virginia,USA
  12. select * from dept;

3、如何加载日期

使用sqlldr加载日期只需在控制文件中date数据类型,并指定要使用的日期掩码。这个日期掩码与数据库中to_char和to_date中使用的日期掩码一样。

如修改dept表如下:

代码
  1. alter table dept add last_updated date;
  2. load data
  3. infile *
  4. into table dept
  5. replace
  6. fields terminated by ','
  7. (deptno,
  8. dname,
  9. loc,
  10. last_updated date 'dd/mm/yyyy'
  11. )
  12. begindata
  13. 10,Accounting,Virginia,1/5/2000
  14. select * from dept;
  15. 1 10
  16. Accounting
  17. Virginia
  18. 2000-5-1

4、如何使用函数加载数据

如果想确保加载的数据是大写的,可以改写控制文件如下:

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. fields terminated by ','
  6. (deptno,
  7. dname "upper(:dname)",
  8. loc "upper(:loc)",
  9. last_updated date 'dd/mm/yyyy'
  10. )
  11. begindata
  12. 10,Accounting,Virginia,1/5/2000
  13. select * from dept;
  14. 1 10
  15. ACCOUNTING
  16. VIRGINIA
  17. 2000-5-1

如下控制文件加载数据无法导入

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. fields terminated by ','
  6. (deptno,
  7. dname "upper(:dname)",
  8. loc "upper(:loc)",
  9. last_updated date 'dd/mm/yyyy',
  10. entire_line ":deptno||:dname||:loc||:last_updated"
  11. )
  12. begindata
  13. 10,Accounting,Virginia,1/5/2000

1)TRAILING NULLCOLS的使用:一般默认用的好

解决方法,就是使用TRAILING NULLCOLS。这样,如果输入记录中不存在某一列的数据,sqlldr就会为该列绑定一个null值。

这种情况下,增加TRAILING NULLCOLS会导致绑定变量:entire_line成为null。

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. fields terminated by ','
  6. TRAILING NULLCOLS
  7. (deptno,
  8. dname "upper(:dname)",
  9. loc "upper(:loc)",
  10. last_updated date 'dd/mm/yyyy',
  11. entire_line ":deptno||:dname||:loc||:last_updated"
  12. )
  13. begindata
  14. 10,Accounting,Virginia,1/5/2000
  15. select * from dept;
  16. 1 10 ACCOUNTING VIRGINIA 10AccountingVirginia1/5/2000 2000-5-1

2)case在sqlldr中的使用

假设输入文件中有以下格式的日期:

HH24:MI:SS:只有一个时间;日期时间默认为sysdate

DD/MM/YYYY:只有一个日期,时间默认为午夜0点

HH24:MI:SS DD/MM/YYYY:日期时间都显式提供

可用如下的控制文件

代码
  1. load data
  2. infile *
  3. into table dept
  4. replace
  5. fields terminated by ','
  6. TRAILING NULLCOLS
  7. (deptno,
  8. dname "upper(:dname)",
  9. loc "upper(:loc)",
  10. last_updated
  11. "case
  12. when length(:last_updated)>9
  13. then to_date(:last_updated,'hh24:mi:ss dd/mm/yyyy')
  14. when instr(:last_updated,':')>0
  15. then to_date(:last_updated,'hh24:mi:ss')
  16. else to_date(:last_updated,'dd/mm/yyyy')
  17. end"
  18. )
  19. begindata
  20. 10,Sales,Virginia,12:03:03 17/10/2005
  21. 20,Accounting,Virginia,02:23:54
  22. 30,Consulting,Virginia,01:24:00 21/10/2006
  23. 40,Finance,Virginia,17/8/2005
  24. alter session set nls_date_format='dd-mon-yyyy hh24:mi:ss';
  25. select * from dept;

5、如何加载有内嵌换行符的数据

1)用非换行符的其它字符来表示换行符,并在加载时使用一个sql函数用一个CHR(10)替换该文本。

代码
  1. alter table dept add comments varchar2(4000);
  2. --使用下列来加载文本
  3. load data
  4. infile *
  5. into table dept
  6. replace
  7. fields terminated by ','
  8. trailing nullcols
  9. (deptno,
  10. dname "upper(:dname)",
  11. loc "upper(:loc)",
  12. comments "replace(:comments,'n',chr(10))" --'n'换行符用chr(10)这个代替
  13. )
  14. begindata
  15. 10,Sales,Virginia,this is the salesnoffice in Virginia

注:调用中必须用n来表示替换符,而不是n

2)在infile指令上使用FIX属性,加载一个定长平面文件。

使用该方法,输入数据必须出现在定长记录中。对于固定位置的数据,使用FIX属性就特别合适,这些文件一般为定长文件。

另外使用该方法时,数据必须在外部存储,不能存储在控制文件本身。

代码
  1. --控制文件
  2. load data
  3. infile demo.dat "fix 80" --指定了输入数据文件demo.dat,这个文件中每个记录80字节
  4. into table dept
  5. replace
  6. fields terminated by ','
  7. trailing nullcols
  8. (deptno,
  9. dname "upper(:dname)",
  10. loc "upper(:loc)",
  11. comments
  12. )
  13. --数据文件
  14. 10,Sales,Virginia,this is the salesnoffice in Virginia
  15. 20,,,Sales,Virginia,this is the salesnoffice in Virginia

注:

在unix上,行结束标记是n即CHR(10),而windows nt平台的行结束标记是rn即CHR(13)||CHR(10);

可以在控制文件中使用trim内置sql函数来完成截断尾部的空白符

代码
  1. select * from dept;

3)在infile指令在、上使用VAR属性,加载一个变宽文件,在该文件使用的格式中,每一行前几个字节指定了这一行的长度

代码
  1. --控制文件
  2. load data
  3. infile demo.dat "var 3" --表明了前三个字节用于记录每一行的字节数
  4. into table dept
  5. replace
  6. fields terminated by ','
  7. trailing nullcols
  8. (deptno,
  9. dname "upper(:dname)",
  10. loc "upper(:loc)",
  11. comments
  12. )
  13. --数据文件
  14. 05410,Sales,Virginia,this is the sales office in Virginia

注:在unix上换行符只算一个字节,在windows nt上算两个字节

代码
  1. select * from dept;

4)在infile指令上使用STR属性,加载一个变宽文件,其中用某个字符序列来表示行结束符,而不是用换行符表示

STR属性以十六进制指定,要得到十六进制串,最容易的办法就是使用sql和utl_raw来生成十六进制串。如在unix平台,行结束标记是CHR(10),我们的特殊字符是一个管道符号(|),则可以写成:

代码
  1. select utl_raw.cast_to_raw('|'||chr(10)) from dual;--可见在unix上为x'7C0A'

在windows上用

代码
  1. select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;--为x'7C0D0A'
  2. --控制文件
  3. load data
  4. infile demo.dat "str x'7C0D0A'"
  5. into table dept
  6. replace
  7. fields terminated by ','
  8. trailing nullcols
  9. (deptno,
  10. dname "upper(:dname)",
  11. loc "upper(:loc)",
  12. comments
  13. )
  14. --数据文件
  15. 10,Sales,Virginia,this is the sales
  16. office in Virginia|
  17. select * from dept;

6、加载lob数据

1)加载内联的lob数据。这些lob数据通常内嵌有换行符和其他特殊字符

代码
  1. --修改表dept
  2. truncate table dept;
  3. alter table dept drop column comments;
  4. alter table dept add comments clob;
  5. --数据文件
  6. 10,Sales,Virginia,this is the sales
  7. office in Virginia|
  8. 20,Accounting,Virginia,this is the Accounting
  9. office in Virginia|
  10. 30,Consuling,Virginia,this is the Consuling
  11. office in Virginia|
  12. 40,Finance,Virginia,"this is the Finance
  13. office in Virginia,it has embedded commas and is
  14. much longer than the other comments filed.If you
  15. feel the need to add double quotes text in here like
  16. this:""you will need to double up those quotes!""to
  17. preserve them in the string. This field keeps going for up to
  18. 1000000 bytes (because of the control file definition I used)
  19. or until we hit the magic and of record marker,
  20. the | followed by an end of line - it is right here ->"|
  21. --控制文件
  22. load data
  23. infile demo.dat "str x'7C0D0A'"
  24. into table dept
  25. replace
  26. fields terminated by ',' optionally enclosed by '"'
  27. trailing nullcols
  28. (deptno,
  29. dname "upper(:dname)",
  30. loc "upper(:loc)",
  31. comments char(1000000) --sqlldr默认输入的字段都是char(255)。char(1000000)表示允许输入多达1000000个字符
  32. )
  33. select * from dept;

2)加载外联的lob数据。

需要把包含有一些文件名的数据文件加载在lob中,而不是让lob数据与结构化数据混在一起。这样就不必使用上述的4种方法之一来避开输入数据中

的内嵌换行符问题,而这种情况在大量的文本或二进制数据中频繁出现。sqlldr称这种额外的数据文件为lobfile。

sqlldr还可以支持加载结构化数据文件。可以告诉sqlldr如何从另外一个文件解析lob数据,这样就可以加载其中的一部分作为结构化数据中的每一行。

sqlldr称这种外部引用的文件为复杂二级数据文件。

lobfile数据采用以下某种格式:

定长字段(从lobfile加载字节100到10000);

定界字段(以某个字符结束,或用某个字符括起);--最常见,以一个文件结束符(EOF)结束

长度/值对,这是一个边长字段

代码
  1. --加载数据的表
  2. create table lob_demo
  3. (owner varchar2(255),
  4. time_stamp date,
  5. filename varchar2(255),
  6. data blob)
  7. --假设有一目录,其中包含想要加载到数据库中的文件。以下为想要加载文件的owner,time_stamp,文件名及文件本身
  8. load data
  9. infile *
  10. replace
  11. into table lob_demo
  12. (owner position(17:25),
  13. time_stamp position(44:55) date "Mon DD HH24:MI",
  14. filename position(57:100),
  15. data lobfile(filename) terminated by EOF
  16. )
  17. begindata
  18. -rw-r--r-- 1 tkyte tkyte 1220342 jun 17 15:26 classes12.zip
  19. select owner,time_stamp,filename,dbms_lob.getlength(data) from lob_demo;

3)将lob数据加载到对象列

一般用于加载图像

代码
  1. create table image_load(
  2. id number,
  3. name varchar2(255),
  4. image ordsys.ordimage) --首先要了解ordsys.ordimage类型

加载这种数据的控制文件如下所示:

代码
  1. load data
  2. infile *
  3. into table image_load
  4. replace
  5. fields terminated by ','
  6. (id,
  7. name,
  8. file_name filler,
  9. image column object
  10. (
  11. source column object
  12. (
  13. localdata lobfile(file_name) terminated by EOF
  14. nullif file_name='none'
  15. )
  16. )
  17. )
  18. begindata
  19. 1,icons,icons.gif

注:column object告诉sqlldr这不是一个列名,而是列名的一部分。

使用的列名是image.source.localdata

代码
  1. select * from image_load
代码
  1. --继续编辑加载进来数据的属性
  2. begin
  3. for c in (select * from image_load) loop
  4. c.image.setproperties;--setproperties是ordsys.ordimage类型提供的方法,处理图像本身,并用适当的值更新对象的其余属性
  5. end loop;
  6. end;

额外介绍:

使用plsql加载lob数据

代码
  1. create table demo (id int primary key,theclob clob)
  2. create or replace directory dir1 as 'D:oracle';
  3. SQL> host echo 'hello world!' >d:/oracle/test.txt
  4. declare
  5. l_clob clob;
  6. l_bfile bfile;
  7. begin
  8. insert into demo values (1, empty_clob()) returning theclob into l_clob;
  9. l_bfile := bfilename('DIR1', 'test.txt');
  10. dbms_lob.fileopen(l_bfile);
  11. dbms_lob.loadfromfile(l_clob, l_bfile, dbms_lob.getlength(l_bfile));
  12. dbms_lob.fileclose(l_bfile);
  13. end;
  14. select dbms_lob.getlength(theclob),theclob from demo;

注:

创建的目录默认为大写DIR1,如果目录写成dir1就会提示错误,如果要想使用混有大小写的目录名,在创建这样的目录时应该带引号的标识符,如下所示:

代码
  1. create or replace directory "dir2" as 'D:oracle';

以上内容是小编给大家分享的关于SqlLoader怎么使用的相关资料,希望大家喜欢。

相关推荐

返回顶部