SqlLoader如何使用
这篇文章将为大家详细讲解有关SqlLoader如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
SQL*Loader(SQLLDR)是Oracle的高速批量数据加载工具。这是一个非常有用的工具,可用于多种平面文件格式向Oralce数据库中加载数据。今天看了申请了*loader的使用,自己小试了下,记录在这
1、假设要插入数据的表ftest,字段是(id,username,password,sj)
2、导入表的数据 以txt格式存储,名为data.txt
1ff2010-8-192f1f12010-8-193f2f22010-8-194f3f32010-8-195f4f42010-8-19
3、写控制文件,格式为ctl,命名为cont.ctl 内容如下:
loaddata infile'c:\data.txt' insertintotableftest fieldsterminatedby""(id,username,password,sj)
注:如果表中没有数据就用insert,有数据就用append,删除旧数据插入新的数据用replace或truncate
4 在cmd命令窗口中执行
sqlldrfyzh/fyzhcontrol=c:\cont.ctldata=c:\data.txt
5 在plsql中查看表ftest
查看已成功插入。
重新学习sqlldr
sqlldr导入数据的一个最简单例子:
loaddatainfile*--告诉sqlldr要加载的数据就包含在控制文件本身intotabledept--加载到哪个表fieldsterminatedby','--数据加载形式应该是逗号分隔的值(deptno,dname,loc)--所要加载的列begindata--告诉sqlldr后面的行市要加载到dept表的数据10,Sales,Virginia20,Accounting,Virginia30,Consulting,Virginia40,Finance,Virginiacreatetabledept(deptnonumber(2)constraintdept_pkprimarykey,dnamevarchar2(14),locvarchar2(13))sqlldruserid=gwm/gwm@fgisdbcontrol=c:\demol.ctlselect*fromdept;110SalesVirginia220AccountingVirginia330ConsultingVirginia440FinanceVirginia
sqlldr导入的四种加载方式:
APPEND :原先的表有数据 就加在后面 INSERT:装载空表 如果原先的表有数据 sqlloader会停止 默认值 REPLACE :原先的表有数据 原先的数据会全部删除 TRUNCATE :指定的内容和replace的相同 会用truncate语句删除现存数据
用SQLLDR加载数据的FAQ
1、如何加载定界数据
1)定界数据即用某个特殊字符分隔的数据,可能用引号括起,这是当前平面文件最常见的数据格式。 对于定界数据,最常用的格式是逗号分隔值格式。采用这种文件格式,数据中的每个字段与下一个字段用一个逗号分隔。文本串可以用引号括起,这样就串本身包含逗号。如果串还必须包含引号,一般约定是使用两个引号。加载定界数据,相应的典型控制文件与前面例子相似,但是fields terminated by子句通常如下指定:
fieldsterminatedby','optionallyencloseby'"'
它指定用逗号分隔数据字段,每个字段可以用双引号括起。如果把这个控制文件的最后部分修改如下:
fieldsterminatedby','optionallyenclosedby'"'(deptno,dname,loc)begindata10,Sales,"Virginia,USA"20,Accounting,"Va,""USA"""30,Consulting,Virginia40,Finance,Virginiaselect*fromdept110SalesVirginia,USA220AccountingVa,"USA"330ConsultingVirginia440FinanceVirginia
2)另一种常用的格式是制表符定界数据。有两种方法使用terminated by子句来加载这种数据:
terminated by X'09' --使用十六进制格式的制表符;若用ASCII,制表符应该是9
terminatedbywhitespace--使用terminatedbywhitespaceloaddatainfile*intotabledeptreplacefieldsterminatedbywhitespace(deptno,dname,loc)begindata10SalesVirginiaselect*fromdept;110SalesVirginia--使用terminatedbyX'09'loaddatainfile*intotabledeptreplacefieldsterminatedbyX'09'(deptno,dname,loc)begindata10SalesVirginiaselect*fromdept;110
Sales --因为一旦遇到一个制表符就会输出一个值。
因此,将10赋给deptno,dname得到了null,因为在第一个制表符和第二个制表符之间没有数据
3)sqlldr的filler关键字使用
如跳过制表符
loaddatainfile*intotabledeptreplacefieldsterminatedbyX'09'(deptno,dummy1filler,dname,dummy2filler,loc)begindata10SalesVirginiaselect*fromdept;110SalesVirginia
2、如何加载固定格式数据
要加载定宽的固定位置数据,将会在控制文件中使用position关键字。
loaddatainfile*intotabledeptreplace(deptnoposition(1:2),dnameposition(3:16),locposition(17:29))begindata10AccountingVirginia,USAselect*fromdept;110AccountingVirginia,USA
这个控制文件没有使用terminated by子句;而是使用了position来告诉sqlldr 字段从哪里开始,到哪里结束。对于position,我们可以使用重叠的位置,可以在记录中来回反复。如下修改dept表:
altertabledeptaddentire_linevarchar(29);
并使用如下控制文件:
loaddatainfile*intotabledeptreplace(deptnoposition(1:2),dnameposition(3:16),locposition(17:29),entire_lineposition(1:29))begindata10AccountingVirginia,USAselect*fromdept;110AccountingVirginia,USA10AccountingVirginia,USA
使用position时,可以使用相对偏移量,也可以使用绝对偏移量。前面的例子使用了绝对偏移量,明确指定字段从哪开始,从哪结束,也可以将前面的控制文件改写如下:
loaddatainfile*intotabledeptreplace(deptnoposition(1:2),dnameposition(*:16),locposition(*:29),entire_lineposition(1:29))begindata10AccountingVirginia,USA
*指示控制文件得出上一个字段在哪里结束。因此,在这种情况下,(*:16)与(3:16)是一样的。注意,控制文件可以混合使用相对位置和绝对位置。另外,使用*表示法时,可以把它与偏移量相加。例如dname从deptno结束之后的;两个字符开始,可以使用(*+2:16),即相当于(5:16).
position子句中的结束位置必须是数据结束的绝对列位置。有时,可能指定每个字段的长度更为容易,特别是如果这些字段是连续的。采用这种
方式,只需告诉sqlldr:记录从第一个字节开始,然后指定每个字段的长度。如下:
loaddatainfile*intotabledeptreplace(deptnoposition(1)char(2),dnameposition(*)char(14),locposition(*)char(13),entire_lineposition(1)char(29))begindata10AccountingVirginia,USAselect*fromdept;
3、如何加载日期
使用sqlldr加载日期只需在控制文件中date数据类型,并指定要使用的日期掩码。这个日期掩码与数据库中to_char和to_date中使用的日期掩码一样。
如修改dept表如下:
altertabledeptaddlast_updateddate;loaddatainfile*intotabledeptreplacefieldsterminatedby','(deptno,dname,loc,last_updateddate'dd/mm/yyyy')begindata10,Accounting,Virginia,1/5/2000select*fromdept;110AccountingVirginia2000-5-1
4、如何使用函数加载数据
如果想确保加载的数据是大写的,可以改写控制文件如下:
loaddatainfile*intotabledeptreplacefieldsterminatedby','(deptno,dname"upper(:dname)",loc"upper(:loc)",last_updateddate'dd/mm/yyyy')begindata10,Accounting,Virginia,1/5/2000select*fromdept;110ACCOUNTINGVIRGINIA2000-5-1
如下控制文件加载数据无法导入
loaddatainfile*intotabledeptreplacefieldsterminatedby','(deptno,dname"upper(:dname)",loc"upper(:loc)",last_updateddate'dd/mm/yyyy',entire_line":deptno||:dname||:loc||:last_updated")begindata10,Accounting,Virginia,1/5/2000
1)TRAILING NULLCOLS的使用:一般默认用的好
解决方法,就是使用TRAILING NULLCOLS。这样,如果输入记录中不存在某一列的数据,sqlldr就会为该列绑定一个null值。
这种情况下,增加TRAILING NULLCOLS会导致绑定变量:entire_line成为null。
loaddatainfile*intotabledeptreplacefieldsterminatedby','TRAILINGNULLCOLS(deptno,dname"upper(:dname)",loc"upper(:loc)",last_updateddate'dd/mm/yyyy',entire_line":deptno||:dname||:loc||:last_updated")begindata10,Accounting,Virginia,1/5/2000select*fromdept;110ACCOUNTINGVIRGINIA10AccountingVirginia1/5/20002000-5-1
2)case在sqlldr中的使用
假设输入文件中有以下格式的日期:HH24:MI:SS:只有一个时间;日期时间默认为sysdateDD/MM/YYYY:只有一个日期,时间默认为午夜0点HH24:MI:SS DD/MM/YYYY:日期时间都显式提供
可用如下的控制文件
loaddatainfile*intotabledeptreplacefieldsterminatedby','TRAILINGNULLCOLS(deptno,dname"upper(:dname)",loc"upper(:loc)",last_updated"casewhenlength(:last_updated)>9thento_date(:last_updated,'hh34:mi:ssdd/mm/yyyy')wheninstr(:last_updated,':')>0thento_date(:last_updated,'hh34:mi:ss')elseto_date(:last_updated,'dd/mm/yyyy')end")begindata10,Sales,Virginia,12:03:0317/10/200520,Accounting,Virginia,02:23:5430,Consulting,Virginia,01:24:0021/10/200640,Finance,Virginia,17/8/2005altersessionsetnls_date_format='dd-mon-yyyyhh34:mi:ss';select*fromdept;
5、如何加载有内嵌换行符的数据
1)用非换行符的其它字符来表示换行符,并在加载时使用一个sql函数用一个CHR(10)替换该文本。
altertabledeptaddcommentsvarchar2(4000);--使用下列来加载文本loaddatainfile*intotabledeptreplacefieldsterminatedby','trailingnullcols(deptno,dname"upper(:dname)",loc"upper(:loc)",comments"replace(:comments,'\\n',chr(10))"--'\\n'换行符用chr(10)这个代替)begindata10,Sales,Virginia,thisisthesales\nofficeinVirginia
注:调用中必须用\\n来表示替换符,而不是\n
2)在infile指令上使用FIX属性,加载一个定长平面文件。 使用该方法,输入数据必须出现在定长记录中。对于固定位置的数据,使用FIX属性就特别合适,这些文件一般为定长文件。 另外使用该方法时,数据必须在外部存储,不能存储在控制文件本身。
--控制文件loaddatainfiledemo.dat"fix80"--指定了输入数据文件demo.dat,这个文件中每个记录80字节intotabledeptreplacefieldsterminatedby','trailingnullcols(deptno,dname"upper(:dname)",loc"upper(:loc)",comments)--数据文件10,Sales,Virginia,thisisthesales\nofficeinVirginia20,,,Sales,Virginia,thisisthesales\nofficeinVirginia
注:
在unix上,行结束标记是\n即CHR(10),而windows nt平台的行结束标记是\r\n即CHR(13)||CHR(10); 可以在控制文件中使用trim内置sql函数来完成截断尾部的空白符
select*fromdept;
3)在infile指令在、上使用VAR属性,加载一个变宽文件,在该文件使用的格式中,每一行前几个字节指定了这一行的长度
--控制文件loaddatainfiledemo.dat"var3"--表明了前三个字节用于记录每一行的字节数intotabledeptreplacefieldsterminatedby','trailingnullcols(deptno,dname"upper(:dname)",loc"upper(:loc)",comments)--数据文件05410,Sales,Virginia,thisisthesalesofficeinVirginia
注:在unix上换行符只算一个字节,在windows nt上算两个字节
select*fromdept;
4)在infile指令上使用STR属性,加载一个变宽文件,其中用某个字符序列来表示行结束符,而不是用换行符表示 STR属性以十六进制指定,要得到十六进制串,最容易的办法就是使用sql和utl_raw来生成十六进制串。如在unix平台,行结束标记是CHR(10),我们的特殊字符是一个管道符号(|),则可以写成:
selectutl_raw.cast_to_raw('|'||chr(10))fromdual;--可见在unix上为x'7C0A'
在windows上用
selectutl_raw.cast_to_raw('|'||chr(13)||chr(10))fromdual;--为x'7C0D0A'--控制文件loaddatainfiledemo.dat"strx'7C0D0A'"intotabledeptreplacefieldsterminatedby','trailingnullcols(deptno,dname"upper(:dname)",loc"upper(:loc)",comments)--数据文件10,Sales,Virginia,thisisthesalesofficeinVirginia|select*fromdept;
6、加载lob数据
1)加载内联的lob数据。这些lob数据通常内嵌有换行符和其他特殊字符
--修改表depttruncatetabledept;altertabledeptdropcolumncomments;altertabledeptaddcommentsclob;--数据文件10,Sales,Virginia,thisisthesalesofficeinVirginia|20,Accounting,Virginia,thisistheAccountingofficeinVirginia|30,Consuling,Virginia,thisistheConsulingofficeinVirginia|40,Finance,Virginia,"thisistheFinanceofficeinVirginia,ithasembeddedcommasandismuchlongerthantheothercommentsfiled.Ifyoufeeltheneedtoadddoublequotestextinherelikethis:""youwillneedtodoubleupthosequotes!""topreservetheminthestring.Thisfieldkeepsgoingforupto1000000bytes(becauseofthecontrolfiledefinitionIused)oruntilwehitthemagicandofrecordmarker,the|followedbyanendofline-itisrighthere->"|--控制文件loaddatainfiledemo.dat"strx'7C0D0A'"intotabledeptreplacefieldsterminatedby','optionallyenclosedby'"'trailingnullcols(deptno,dname"upper(:dname)",loc"upper(:loc)",commentschar(1000000)--sqlldr默认输入的字段都是char(255)。char(1000000)表示允许输入多达1000000个字符)select*fromdept;
2)加载外联的lob数据。
需要把包含有一些文件名的数据文件加载在lob中,而不是让lob数据与结构化数据混在一起。这样就不必使用上述的4种方法之一来避开输入数据中的内嵌换行符问题,而这种情况在大量的文本或二进制数据中频繁出现。sqlldr称这种额外的数据文件为lobfile。 sqlldr还可以支持加载结构化数据文件。可以告诉sqlldr如何从另外一个文件解析lob数据,这样就可以加载其中的一部分作为结构化数据中的每一行。sqlldr称这种外部引用的文件为复杂二级数据文件。
lobfile数据采用以下某种格式:
定长字段(从lobfile加载字节100到10000); 定界字段(以某个字符结束,或用某个字符括起);--最常见,以一个文件结束符(EOF)结束 长度/值对,这是一个边长字段
--加载数据的表createtablelob_demo(ownervarchar2(255),time_stampdate,filenamevarchar2(255),datablob)--假设有一目录,其中包含想要加载到数据库中的文件。以下为想要加载文件的owner,time_stamp,文件名及文件本身loaddatainfile*replaceintotablelob_demo(ownerposition(17:25),time_stampposition(44:55)date"MonDDHH24:MI",filenameposition(57:100),datalobfile(filename)terminatedbyEOF)begindata-rw-r--r--1tkytetkyte1220342jun1715:26classes12.zipselectowner,time_stamp,filename,dbms_lob.getlength(data)fromlob_demo;
3)将lob数据加载到对象列
一般用于加载图像
createtableimage_load(idnumber,namevarchar2(255),imageordsys.ordimage)--首先要了解ordsys.ordimage类型
加载这种数据的控制文件如下所示:
loaddatainfile*intotableimage_loadreplacefieldsterminatedby','(id,name,file_namefiller,imagecolumnobject(sourcecolumnobject(localdatalobfile(file_name)terminatedbyEOFnulliffile_name='none')))begindata1,icons,icons.gif
注:column object告诉sqlldr这不是一个列名,而是列名的一部分。
使用的列名是image.source.localdata
select*fromimage_load
--继续编辑加载进来数据的属性beginforcin(select*fromimage_load)loopc.image.setproperties;--setproperties是ordsys.ordimage类型提供的方法,处理图像本身,并用适当的值更新对象的其余属性endloop;end;
额外介绍:
使用plsql加载lob数据
createtabledemo(idintprimarykey,theclobclob)createorreplacedirectorydir1as'D:\oracle';SQL>hostecho'helloworld!'>d:/oracle/test.txtdeclarel_clobclob;l_bfilebfile;begininsertintodemovalues(1,empty_clob())returningtheclobintol_clob;l_bfile:=bfilename('DIR1','test.txt');dbms_lob.fileopen(l_bfile);dbms_lob.loadfromfile(l_clob,l_bfile,dbms_lob.getlength(l_bfile));dbms_lob.fileclose(l_bfile);end;selectdbms_lob.getlength(theclob),theclobfromdemo;
注:
创建的目录默认为大写DIR1,如果目录写成dir1就会提示错误,如果要想使用混有大小写的目录名,在创建这样的目录时应该带引号的标识符,如下所示:
createorreplacedirectory"dir2"as'D:\oracle';
关于“SqlLoader如何使用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。