这里用 excel 数据做个最简单的测试。 1)把 excel 数据存为 t.txt 文件,注意文件后缀名为 .txt 1 jhchen // :: --7 : 2 jhchen // :: --7 : 3 jhchen // :: --7 : 2)SQL> create table t_load( id number, name varchar2(), dat1 date, dat2 date, dat3 date ); Table created. 3)控制文件 t.ctl 如下 load data infile 't.txt' badfile 't.bad' append into table t_load fields terminated by X'' trailing nullcols ( id , name , dat1 date "mm/dd/yyyy hh:mi:ss", dat2 date "yyyy-mm-dd hh:mi:ss" ) 其中,X'' 是制表符,TAB键,trailing nullcols 表示如表的字段没有对应的值时允许为空。 4)C:Documents and Settingscjh>sqlldr userid=jhchen/oracle control=t.ctl SQL*Loader: Release 9.2.0.6.0 - Production on 星期一 月 7 :: Copyright (c) , , Oracle Corporation. All rights reserved. 达到提交点,逻辑记录计数3 5)SQL> select * from t_load; ID NAME DAT1 DAT2 DAT3 ---------- ---------- --------- --------- --------- 1 jhchen -NOV- -NOV- 2 jhchen -NOV- -NOV- 3 jhchen -NOV- -NOV- sqlldr userid=lgone/tiger control=a.ctl LOAD DATA INFILE 't.dat' // 要导入的文件 // INFILE 'tt.date' // 导入多个文件 // INFILE * // 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容 INTO TABLE table_name // 指定装入的表 BADFILE 'c:bad.txt' // 指定坏文件地址 ************* 以下是4种装入表的方式 APPEND // 原先的表有数据 就加在后面 // INSERT // 装载空表 如果原先的表有数据 sqlloader会停止 默认值 // REPLACE // 原先的表有数据 原先的数据会全部删除 // TRUNCATE // 指定的内容和replace的相同 会用truncate语句删除现存数据 ************* 指定的TERMINATED可以在表的开头 也可在表的内部字段部分 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' // 装载这种数据: ,lg,"""lg""","lg,lg" // 在表中结果: lg "lg" lg,lg // TERMINATED BY X '' // 以十六进制格式 '' 表示的 // TERMINATED BY WRITESPACE // 装载这种数据: lg lg TRAILING NULLCOLS ************* 表的字段没有对应的值时允许为空 ************* 下面是表的字段 ( col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载 // 如: lg,lg,not 结果 lg lg ) // 当没声明FIELDS TERMINATED BY ',' 时 // ( // col_1 [interger external] TERMINATED BY ',' , // col_2 [date "dd-mon-yyy"] TERMINATED BY ',' , // col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg' // ) // 当没声明FIELDS TERMINATED BY ','用位置告诉字段装载数据 // ( // col_1 position(1:2), // col_2 position(3:), // col_3 position(*:), // 这个字段的开始位置在前一字段的结束位置 // col_4 position(1:), // col_5 position(3:) char(8) // 指定字段的类型 // ) BEGINDATA // 对应开始的 INFILE * 要导入的内容就在control文件里 ,Sql,what ,lg,show ===================================================================================== //////////// 注意begindata后的数值前面不能有空格 1 ***** 普通装载 LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (DEPTNO, DNAME, LOC ) BEGINDATA ,Sales,"""USA""" ,Accounting,"Virginia,USA" ,Consulting,Virginia ,Finance,Virginia ,"Finance","",Virginia // loc 列将为空 ,"Finance",,Virginia // loc 列将为空 2 ***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'' 的情况 LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY WHITESPACE -- FIELDS TERMINATED BY x'' (DEPTNO, DNAME, LOC ) BEGINDATA Sales Virginia 3 ***** 指定不装载那一列 LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ( DEPTNO, FILLER_1 FILLER, // 下面的 "Something Not To Be Loaded" 将不会被装载 DNAME, LOC ) BEGINDATA ,Something Not To Be Loaded,Accounting,"Virginia,USA" 4 ***** position的列子 LOAD DATA INFILE * INTO TABLE DEPT REPLACE ( DEPTNO position(1:2), DNAME position(*:), // 这个字段的开始位置在前一字段的结束位置 LOC position(*:), ENTIRE_LINE position(1:) ) BEGINDATA Accounting Virginia,USA 5 ***** 使用函数 日期的一种表达 TRAILING NULLCOLS的使用 LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应 // 的列的值的 如果第一行改为 ,Sales,Virginia,1/5/,, 就不用TRAILING NULLCOLS了 (DEPTNO, DNAME "upper(:dname)", // 使用函数 LOC "upper(:loc)", LAST_UPDATED date 'dd/mm/yyyy', // 日期的一种表达方式 还有'dd-mon-yyyy' 等 ENTIRE_LINE ":deptno||:dname||:loc||:last_updated" ) BEGINDATA ,Sales,Virginia,1/5/ ,Accounting,Virginia,/6/ ,Consulting,Virginia,5/1/ ,Finance,Virginia,/3/ 6 ***** 使用自定义的函数 // 解决的时间问题 create or replace function my_to_date( p_string in varchar2 ) return date as type fmtArray is table of varchar2(); l_fmts fmtArray := fmtArray( 'dd-mon-yyyy', 'dd-month-yyyy', 'dd/mm/yyyy', 'dd/mm/yyyy hh:mi:ss' ); l_return date; begin for i in 1 .. l_fmts.count loop begin l_return := to_date( p_string, l_fmts(i) ); exception when others then null; end; EXIT when l_return is not null; end loop; if ( l_return is null ) then l_return := new_time( to_date('','ddmmyyyy') + 1/// * p_string, 'GMT', 'EST' ); end if; return l_return; end; / LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' TRAILING NULLCOLS (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED "my_to_date( :last_updated )" // 使用自定义的函数 ) BEGINDATA ,Sales,Virginia,-april- ,Accounting,Virginia,// ,Consulting,Virginia,// :: ,Finance,Virginia, ,Finance,Virginia,-apr- ,Finance,Virginia,Not a date 7 ***** 合并多行记录为一行记录 LOAD DATA INFILE * concatenate 3 // 通过关键字concatenate 把几行的记录看成一行记录 INTO TABLE DEPT replace FIELDS TERMINATED BY ',' (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED date 'dd/mm/yyyy' ) BEGINDATA ,Sales, // 其实这3行看成一行 ,Sales,Virginia,1/5/ Virginia, 1/5/ // 这列子用 continueif list="," 也可以 告诉sqlldr在每行的末尾找逗号 找到逗号就把下一行附加到上一行 LOAD DATA INFILE * continueif this(1:1) = '-' // 找每行的开始是否有连接字符 - 有就把下一行连接为一行 // 如 -,Sales,Virginia, // 1/5/ 就是一行 ,Sales,Virginia,1/5/ // 其中1:1 表示从第一行开始 并在第一行结束 还有continueif next 但continueif list最理想 INTO TABLE DEPT replace FIELDS TERMINATED BY ',' (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED date 'dd/mm/yyyy' ) BEGINDATA // 但是好象不能象右面的那样使用 -,Sales,Virginia, -,Sales,Virginia, 1/5/ 1/5/ -, ,Finance,Virginia,// Finance,Virginia,// 8 ***** 载入每行的行号 load data infile * into table t replace ( seqno RECNUM //载入每行的行号 text Position(1:)) BEGINDATA fsdfasj //自动分配一行号给载入 表t 的seqno字段 此行为 1 fasdjfasdfl // 此行为 2 ... 9 ***** 载入有换行符的数据 注意: unix 和 windows 不同 \n & /n < 1 > 使用一个非换行符的字符 LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' TRAILING NULLCOLS (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED "my_to_date( :last_updated )", COMMENTS "replace(:comments,'n',chr())" // replace 的使用帮助转换换行符 ) BEGINDATA ,Sales,Virginia,-april-,This is the SalesnOffice in Virginia ,Accounting,Virginia,//,This is the AccountingnOffice in Virginia ,Consulting,Virginia,// ::,This is the ConsultingnOffice in Virginia ,Finance,Virginia,,This is the FinancenOffice in Virginia < 2 > 使用fix属性 LOAD DATA INFILE demo.dat "fix " INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' TRAILING NULLCOLS (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED "my_to_date( :last_updated )", COMMENTS ) demo.dat ,Sales,Virginia,-april-,This is the Sales Office in Virginia ,Accounting,Virginia,//,This is the Accounting Office in Virginia ,Consulting,Virginia,// ::,This is the Consulting Office in Virginia ,Finance,Virginia,,This is the Finance Office in Virginia // 这样装载会把换行符装入数据库 下面的方法就不会 但要求数据的格式不同 LOAD DATA INFILE demo.dat "fix " INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED "my_to_date( :last_updated )", COMMENTS ) demo.dat ,Sales,Virginia,-april-,"This is the Sales Office in Virginia" ,Accounting,Virginia,//,"This is the Accounting Office in Virginia" ,Consulting,Virginia,// ::,"This is the Consulting Office in Virginia" ,Finance,Virginia,,"This is the Finance Office in Virginia" < 3 > 使用var属性 LOAD DATA INFILE demo.dat "var 3" // 3 告诉每个记录的前3个字节表示记录的长度 如第一个记录的 表示此记录有 个字节 INTO TABLE DEPT REPLACE FIELDS TERMINATED BY ',' TRAILING NULLCOLS (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED "my_to_date( :last_updated )", COMMENTS ) demo.dat ,Sales,Virginia,-april-,This is the Sales Office in Virginia ,Accounting,Virginia,//,This is the Accounting Office in Virginia ,Consulting,Virginia,// ::,This is the Consulting Office in Virginia ,Finance,Virginia,,This is the Finance Office in Virginia < 4 > 使用str属性 // 最灵活的一中 可定义一个新的行结尾符 win 回车换行 : chr()||chr() 此列中记录是以 a|rn 结束的 select utl_raw.cast_to_raw('|'||chr()||chr()) from dual; 结果 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)", LAST_UPDATED "my_to_date( :last_updated )", COMMENTS ) demo.dat ,Sales,Virginia,-april-,This is the Sales Office in Virginia| ,Accounting,Virginia,//,This is the Accounting Office in Virginia| ,Consulting,Virginia,// ::,This is the Consulting Office in Virginia| ,Finance,Virginia,,This is the Finance Office in Virginia| ============================================================================== 象这样的数据 用 nullif 子句 -jan-Flipper seemed unusually hungry today. -jan-Spread over three meals. id position(1:3) nullif // 这里可以是blanks 或者别的表达式 // 下面是另一个列子 第一行的 1 在数据库中将成为 null LOAD DATA INFILE * INTO TABLE T REPLACE (n position(1:2) integer external nullif n='1', v position(3:8) ) BEGINDATA 1 lg
推荐整理分享sqlldr装载数据实现代码(sql*loader-309),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:sqlloader941,sql loader-350,sql loader,安装sqlldr,sqlloader append,sql*loader-309,sql loader-350,sqlloader append,内容如对您有帮助,希望把文章链接给更多的朋友!
sql server字符串非空判断实现方法 CREATEfunctiongetcolor(@井号varchar(),@层位varchar())returnsvarchar()asbegindeclare@sqlvarchar();set@sql=''--distinctselect@sql=@sql+颜色+','from(selectdistinct颜色fromyourtablename
使用xp_cmdshell注销Windows登录用户(终端服务器超出最大连接数) 公司日常项目更新使用TFP,服务器一般维护用远程桌面管理,所以经常登录到服务器,但有时由于某种原因,登录到服务器后,帐号没有及时注销,致使后面无
SQL order by ID desc/asc加一个排序的字段解决查询慢问题 解决方法就是在orderbyIDdesc再加一个排序的字段,这样子可能会把速度提高很多。再加止排序的字段因查询而异了如表CREATETABLE[dbo].[CMPP_SendCentre]([id][int]ID