SqlLoader怎么使用
SQLLoader(SQLLDR)是Oracle的高速批量数据加载工具。这是一个非常有用的工具,可用于多种平面文件格式向Oralce数据库中加载数据。今天看了申请了loader的使用,自己小试了下,记录在这
1、假设要插入数据的表ftest,字段是(id,username,password,sj)
2、导入表的数据 以txt格式存储,名为data.txt
1 f f 2010-8-19 2 f1 f1 2010-8-19 3 f2 f2 2010-8-19 4 f3 f3 2010-8-19 5 f4 f4 2010-8-19
3、写控制文件,格式为ctl,命名为cont.ctl 内容如下
load data infile 'c:\data.txt' insert into table ftest fields terminated by " " (id,username,password,sj)
注如果表中没有数据就用insert,有数据就用append,删除旧数据插入新的数据用replace或truncate
4 在cmd命令窗口中执行
sqlldr fyzh/fyzh control=c:\cont.ctl data=c:\data.txt
5 在plsql中查看表ftest
查看已成功插入。
重新学习sqlldr
sqlldr导入数据的一个最简单例子
load data infile --告诉sqlldr要加载的数据就包含在控制文件本身 into table dept --加载到哪个表 fields terminated by ',' --数据加载形式应该是逗号分隔的值 (deptno,dname,loc) --所要加载的列 begindata --告诉sqlldr后面的行市要加载到dept表的数据 10,Sales,Virginia 20,Aounting,Virginia 30,Consulting,Virginia 40,Finance,Virginia create table dept (deptno number(2) constraint dept_pk primary key, dname varchar2(14), loc varchar2(13) ) sqlldr userid=gwm/gwm@fgisdb control=c:\demol.ctl select from dept; 1 10 Sales Virginia 2 20 Aounting Virginia 3 30 Consulting Virginia 4 40 Finance Virginia
sqlldr导入的四种加载方式
APPEND 原先的表有数据 就加在后面
INSERT装载空表 如果原先的表有数据 sqlloader会停止 默认值
REPLACE 原先的表有数据 原先的数据会全部删除
TRUNCATE 指定的内容和replace的相同 会用truncate语句删除现存数据
用SQLLDR加载数据的FAQ
1、如何加载定界数据
1)定界数据即用某个特殊字符分隔的数据,可能用引号括起,这是当前平面文件最常见的数据格式。
对于定界数据,最常用的格式是逗号分隔值格式。采用这种文件格式,数据中的每个字段与下一个字段用一个逗号分隔。文本串可以用引号括起,这样就串本身包含逗号。如果串还必须包含引号,一般约定是使用两个引号。加载定界数据,相应的典型控制文件与前面例子相似,fields terminated by子句通常如下指定
fields terminated by ',' optionally enclose by '"'
它指定用逗号分隔数据字段,每个字段可以用双引号括起。如果把这个控制文件的部分修改如下:
fields terminated by ',' optionally enclosed by '"' (deptno,dname,loc) begindata 10,Sales,"Virginia,USA" 20,Aounting,"Va,""USA""" 30,Consulting,Virginia 40,Finance,Virginia select from dept 1 10 Sales Virginia,USA 2 20 Aounting Va,"USA" 3 30 Consulting Virginia 4 40 Finance Virginia
2)另一种常用的格式是制表符定界数据。有两种方法使用terminated by子句来加载这种数据
terminated by X'09' --使用十六进制格式的制表符;若用ASCII,制表符应该是9
terminated by whitespace --使用terminated by whitespace load data infile into table dept replace fields terminated by whitespace (deptno,dname,loc) begindata 10 Sales Virginia select from dept; 1 10 Sales Virginia --使用terminated by X'09' load data infile into table dept replace fields terminated by X'09' (deptno,dname,loc) begindata 10 Sales Virginia select from dept; 1 10
Sales --因为一旦遇到一个制表符就会输出一个值。
,将10赋给deptno,dname得到了null,因为在第一个制表符和第二个制表符之间没有数据
3)sqlldr的filler关键字使用
如跳过制表符
load data infile into table dept replace fields terminated by X'09' (deptno,dummy1 filler,dname,dummy2 filler,loc) begindata 10 Sales Virginia select from dept; 1 10 Sales Virginia
2、如何加载固定格式数据
要加载定宽的固定位置数据,将会在控制文件中使用position关键字。
load data infile into table dept replace (deptno position(1:2), dname position(3:16), loc position(17:29) ) begindata 10Aounting Virginia,USA select from dept; 1 10 Aounting Virginia,USA
这个控制文件没有使用terminated by子句;而是使用了position来告诉sqlldr 字段从哪里开始,到哪里结束。
对于position,我们可以使用重叠的位置,可以在记录中来回反复。如下修改dept表
alter table dept add entire_line varchar(29);
并使用如下控制文件
load data infile into table dept replace (deptno position(1:2), dname position(3:16), loc position(17:29), entire_line position(1:29) ) begindata 10Aounting Virginia,USA select from dept; 1 10 Aounting Virginia,USA 10Aounting Virginia,USA
使用position时,可以使用相对偏移量,也可以使用绝对偏移量。前面的例子使用了绝对偏移量,明确指定字段从哪开始,从哪结束,也可以将
前面的控制文件改写如下
load data infile into table dept replace (deptno position(1:2), dname position(:16), loc position(:29), entire_line position(1:29) ) begindata 10Aounting Virginia,USA
指示控制文件得出上一个字段在哪里结束。,在这种情况下,(:16)与(3:16)是一样的。注意,控制文件可以混合使用相对位置和绝对位置。
,使用表示法时,可以把它与偏移量相加。例如dname从deptno结束之后的;两个字符开始,可以使用(+2:16),即相当于(5:16).
position子句中的结束位置必须是数据结束的绝对列位置。有时,可能指定每个字段的长度更为容易,特别是如果这些字段是连续的。采用这种
方式,只需告诉sqlldr记录从第一个字节开始,然后指定每个字段的长度。如下
load data infile into table dept replace (deptno position(1) char(2), dname position() char(14), loc position() char(13), entire_line position(1) char(29) ) begindata 10Aounting Virginia,USA select from dept;
3、如何加载日期
使用sqlldr加载日期只需在控制文件中date数据类型,并指定要使用的日期掩码。这个日期掩码与数据库中to_char和to_date中使用的日期掩码一样。
如修改dept表如下
alter table dept add last_updated date; load data infile into table dept replace fields terminated by ',' (deptno, dname, loc, last_updated date 'dd/mm/yyyy' ) begindata 10,Aounting,Virginia,1/5/2000 select from dept; 1 10 Aounting Virginia 2000-5-1
4、如何使用函数加载数据
如果想确保加载的数据是大写的,可以改写控制文件如下
load data infile into table dept replace fields terminated by ',' (deptno, dname "upper(:dname)", loc "upper(:loc)", last_updated date 'dd/mm/yyyy' ) begindata 10,Aounting,Virginia,1/5/2000 select from dept; 1 10 ACCOUNTING VIRGINIA 2000-5-1
如下控制文件加载数据无法导入
load data infile into table dept replace fields terminated by ',' (deptno, dname "upper(:dname)", loc "upper(:loc)", last_updated date 'dd/mm/yyyy', entire_line ":deptno||:dname||:loc||:last_updated" ) begindata 10,Aounting,Virginia,1/5/2000
1)TRAILING NULLCOLS的使用一般默认用的好
解决方法,就是使用TRAILING NULLCOLS。这样,如果输入记录中不存在某一列的数据,sqlldr就会为该列绑定一个null值。
这种情况下,增加TRAILING NULLCOLS会导致绑定变量:entire_line成为null。
load data infile into table dept replace fields terminated by ',' TRAILING NULLCOLS (deptno, dname "upper(:dname)", loc "upper(:loc)", last_updated date 'dd/mm/yyyy', entire_line ":deptno||:dname||:loc||:last_updated" ) begindata 10,Aounting,Virginia,1/5/2000 select from dept; 1 10 ACCOUNTING VIRGINIA 10AountingVirginia1/5/2000 2000-5-1
2)case在sqlldr中的使用
假设输入文件中有以下格式的日期
HH24:MI:SS:只有一个时间;日期时间默认为sysdate
DD/MM/YYYY:只有一个日期,时间默认为午夜0点
HH24:MI:SS DD/MM/YYYY:日期时间都显式提供
可用如下的控制文件
load data infile into table dept replace fields terminated by ',' TRAILING NULLCOLS (deptno, dname "upper(:dname)", loc "upper(:loc)", last_updated "case when length(:last_updated)>9 then to_date(:last_updated,'hh24:mi:ss dd/mm/yyyy') when instr(:last_updated,':')>0 then to_date(:last_updated,'hh24:mi:ss') else to_date(:last_updated,'dd/mm/yyyy') end" ) begindata 10,Sales,Virginia,12:03:03 17/10/2005 20,Aounting,Virginia,02:23:54 30,Consulting,Virginia,01:24:00 21/10/2006 40,Finance,Virginia,17/8/2005 alter session set nls_date_format='dd-mon-yyyy hh24:mi:ss'; select from dept;
5、如何加载有内嵌换行符的数据
1)用非换行符的其它字符来表示换行符,并在加载时使用一个sql函数用一个CHR(10)替换该文本。
alter table dept add ments varchar2(4000); --使用下列来加载文本 load data infile into table dept replace fields terminated by ',' trailing nullcols (deptno, dname "upper(:dname)", loc "upper(:loc)", ments "replace(:ments,'\\n',chr(10))" --'\\n'换行符用chr(10)这个代替 ) begindata 10,Sales,Virginia,this is the sales\noffice in Virginia
注调用中必须用来表示替换符,而不是\n
2)在infile指令上使用FIX属性,加载一个定长平面文件。
使用该方法,输入数据必须出现在定长记录中。对于固定位置的数据,使用FIX属性就特别合适,这些文件一般为定长文件。
使用该方法时,数据必须在外部存储,不能存储在控制文件本身。
--控制文件 load data infile demo.dat "fix 80" --指定了输入数据文件demo.dat,这个文件中每个记录80字节 into table dept replace fields terminated by ',' trailing nullcols (deptno, dname "upper(:dname)", loc "upper(:loc)", ments ) --数据文件 10,Sales,Virginia,this is the sales\noffice in Virginia 20,,,Sales,Virginia,this is the sales\noffice in Virginia
注
在unix上,行结束标记是\n即CHR(10),而windows nt平台的行结束标记是\r\n即CHR(13)||CHR(10);
可以在控制文件中使用trim内置sql函数来完成截断尾部的空白符
select from dept;
3)在infile指令在、上使用VAR属性,加载一个变宽文件,在该文件使用的格式中,每一行前几个字节指定了这一行的长度
--控制文件 load data infile demo.dat "var 3" --表明了前三个字节用于记录每一行的字节数 into table dept replace fields terminated by ',' trailing nullcols (deptno, dname "upper(:dname)", loc "upper(:loc)", ments ) --数据文件 05410,Sales,Virginia,this is the sales office in Virginia
注在unix上换行符只算一个字节,在windows nt上算两个字节
select from dept;
4)在infile指令上使用STR属性,加载一个变宽文件,其中用某个字符序列来表示行结束符,而不是用换行符表示
STR属性以十六进制指定,要得到十六进制串,最容易的办法就是使用sql和utl_raw来生成十六进制串。如在unix平台,行结束标记是CHR(10),我们的特殊字符是一个管道符号(|),则可以写成
select utl_raw.cast_to_raw('|'||chr(10)) from dual;--可见在unix上为x'7C0A'
在windows上用
select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;--为x'7C0D0A' --控制文件 load data infile demo.dat "str x'7C0D0A'" into table dept replace fields terminated by ',' trailing nullcols (deptno, dname "upper(:dname)", loc "upper(:loc)", ments ) --数据文件 10,Sales,Virginia,this is the sales office in Virginia| select from dept;
6、加载lob数据
1)加载内联的lob数据。这些lob数据通常内嵌有换行符和其他特殊字符
--修改表dept truncate table dept; alter table dept drop column ments; alter table dept add ments clob; --数据文件 10,Sales,Virginia,this is the sales office in Virginia| 20,Aounting,Virginia,this is the Aounting office in Virginia| 30,Consuling,Virginia,this is the Consuling office in Virginia| 40,Finance,Virginia,"this is the Finance office in Virginia,it has embedded mas and is much longer than the other ments filed.If you feel the need to add double quotes text in here like this:""you will need to double up those quotes!""to preserve them in the string. This field keeps going for up to 1000000 bytes (because of the control file definition I used) or until we hit the magic and of record marker, the | followed by an end of line - it is right here ->"| --控制文件 load data infile demo.dat "str x'7C0D0A'" into table dept replace fields terminated by ',' optionally enclosed by '"' trailing nullcols (deptno, dname "upper(:dname)", loc "upper(:loc)", ments char(1000000) --sqlldr默认输入的字段都是char(255)。char(1000000)表示允许输入多达1000000个字符 ) select from dept;
2)加载外联的lob数据。
需要把包含有一些文件名的数据文件加载在lob中,而不是让lob数据与结构化数据混在一起。这样就不必使用上述的4种方法之一来避开输入数据中
的内嵌换行符问题,而这种情况在大量的文本或二进制数据中频繁出现。sqlldr称这种额外的数据文件为lobfile。
sqlldr还可以支持加载结构化数据文件。可以告诉sqlldr如何从一个文件解析lob数据,这样就可以加载其中的一部分作为结构化数据中的每一行。
sqlldr称这种外部引用的文件为复杂二级数据文件。
lobfile数据采用以下某种格式:
定长字段(从lobfile加载字节100到10000);
定界字段(以某个字符结束,或用某个字符括起);--最常见,以一个文件结束符(EOF)结束
长度/值对,这是一个边长字段
--加载数据的表 create table lob_demo (owner varchar2(255), time_stamp date, filename varchar2(255), data blob) --假设有一目录,其中包含想要加载到数据库中的文件。以下为想要加载文件的owner,time_stamp,文件名及文件本身 load data infile replace into table lob_demo (owner position(17:25), time_stamp position(44:55) date "Mon DD HH24:MI", filename position(57:100), data lobfile(filename) terminated by EOF ) begindata -rw-r--r-- 1 tkyte tkyte 1220342 jun 17 15:26 classes12.zip select owner,time_stamp,filename,dbms_lob.getlength(data) from lob_demo;
3)将lob数据加载到对象列
一般用于加载图像
create table image_load( id number, name varchar2(255), image ordsys.ordimage) --要了解ordsys.ordimage类型
加载这种数据的控制文件如下所示
load data infile into table image_load replace fields terminated by ',' (id, name, file_name filler, image column object ( source column object ( localdata lobfile(file_name) terminated by EOF nullif file_name='none' ) ) ) begindata 1,icons,icons.gif
注column object告诉sqlldr这不是一个列名,而是列名的一部分。
使用的列名是image.source.localdata
select from image_load
--继续编辑加载进来数据的属性 begin for c in (select from image_load) loop c.image.setproperties;--setproperties是ordsys.ordimage类型提供的方法,处理图像本身,并用适当的值更新对象的其余属性 end loop; end;
额外介绍
使用plsql加载lob数据
create table demo (id int primary key,theclob clob) create or replace directory dir1 as 'D:\oracle'; SQL> host echo 'hello world!' >d:/oracle/test.txt declare l_clob clob; l_bfile bfile; begin insert into demo values (1, empty_clob()) returning theclob into l_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; select dbms_lob.getlength(theclob),theclob from demo;
注
创建的目录默认为大写DIR1,如果目录写成dir1就会提示错误,如果要想使用混有大小写的目录名,在创建这样的目录时应该带引号的标识符,如下所示
create or replace directory "dir2" as 'D:\oracle';
以上内容是长沙网络推广给大家分享的关于SqlLoader怎么使用的相关资料,希望大家喜欢。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程