1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

Oracle数据库SqlLoad常用技巧总结

2022-11-21 | 数据库 | gtxyzz | 581°c
A+ A-

Oracle数据库SqlLoad常用技巧的相关知识是本文我们主要要介绍的内容,本文我们总结了14种SqlLoad的使用技巧,并给出了测试用的文件源码,接下来我们就开始一一介绍这部分内容,希望能够对您有所帮助。

1、控制文件中注释用“–”。

2、为防止导入出现中文乱码,在控制文件中加入字符集控制

LOADDATA 
CHARACTERSETZHS16GBK

3、让某一列成为行号,用RECNUM关键字

loaddata 
infile* 
intotablet 
replace 
(seqnoRECNUM//载入每行的行号 
textPosition(1:1024)) 
BEGINDATA 
fsdfasj

4、过滤某一列,用FILLER关键字

LOADDATA 
TRUNCATEINTOTABLET1 
FIELDSTERMINATEDBY',' 
(field1, 
field2FILLER, 
field3 
)

5、过滤行

在INTO TABLE table_name后加WHEN过滤条件,但功能有限,如果以竖线分隔符的文件,不能实现字段级的过滤,定长的还好。

LOADDATA 
INFILE'mydata.dat' 
BADFILE'mydata.bad' 
DISCARDFILE'mydata.dis' 
APPEND 
INTOTABLEmy_selective_table 
WHEN(01)<>'H'and(01)<>'T'and(30:37)='20031217' 
( 
regionCONSTANT'31', 
service_keyPOSITION(01:11)INTEGEREXTERNAL, 
call_b_noPOSITION(12:29)CHAR 
)

6、过滤首行,用OPTIONS (SKIP 1)选项,也可以写在命令行中,如:

sqlldrsms/admincontrol=test.ctlskip=1

7、TRAILING NULLCOLS的使用,作用是表的字段没有对应的值时允许为空

如:

LOADDATA 
INFILE* 
INTOTABLEDEPT 
REPLACE 
FIELDSTERMINATEDBY',' 
TRAILINGNULLCOLS//其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应的列的值的如果第一行改为10,Sales,Virginia,1/5/2000,,就不用TRAILINGNULLCOLS了 
(DEPTNO, 
DNAME"upper(:dname)",//使用函数 
LOC"upper(:loc)", 
LAST_UPDATEDdate'dd/mm/yyyy',//日期的一种表达方式还有'dd-mon-yyyy'等 
ENTIRE_LINE":deptno||:dname||:loc||:last_updated" 
) 
BEGINDATA 
10,Sales,Virginia,1/5/2000 
20,Accounting,Virginia,21/6/1999 
30,Consulting,Virginia,5/1/2000 
40,Finance,Virginia,15/3/2001

8、添加、修改数据

(1)、

LOADDATA 
INFILE* 
INTOTABLEtmp_test 
(rec_no"my_db_sequence.nextval", 
regionCONSTANT'31', 
time_loaded"to_char(SYSDATE,'HH24:MI')", 
data1POSITION(1:5)":data1/100", 
data2POSITION(6:15)"upper(:data2)", 
data3POSITION(16:22)"to_date(:data3,'YYMMDD')" 
) 
BEGINDATA 
11111AAAAAAAAAA991201 
22222BBBBBBBBBB990112

(2)、

LOADDATA 
INFILE'mail_orders.txt' 
BADFILE'bad_orders.txt' 
APPEND 
INTOTABLEmailing_list 
FIELDSTERMINATEDBY"," 
(addr, 
city, 
state, 
zipcode, 
mailing_addr"decode(:mailing_addr,null,:addr,:mailing_addr)", 
mailing_city"decode(:mailing_city,null,:city,:mailing_city)", 
mailing_state 
)

9、合并多行记录为一行记录

通过关键字concatenate 把几行的记录看成一行记录:

LOADDATA 
INFILE* 
concatenate3//通过关键字concatenate把几行的记录看成一行记录 
INTOTABLEDEPT 
replace 
FIELDSTERMINATEDBY',' 
(DEPTNO, 
DNAME"upper(:dname)", 
LOC"upper(:loc)", 
LAST_UPDATEDdate'dd/mm/yyyy' 
) 
BEGINDATA 
10,Sales,//其实这3行看成一行10,Sales,Virginia,1/5/2000 
Virginia, 
1/5/2000

10、用”|+|”分隔符,避免数据混淆:fields terminated by "|+|"

11、如果数据文件包含在控制文件中,用INFILE *

如下:

LOADDATA 
INFILE* 
append 
INTOTABLEtmp_test 
FIELDSTERMINATEDBY"," 
OPTIONALLYENCLOSEDBY'"' 
TRAILINGNULLCOLS 
(data1, 
data2 
) 
BEGINDATA 
11111,AAAAAAAAAA 
22222,"A,B,C,D,"

12、一次导入多个文件到同一个表

LOADDATA 
INFILEfile1.dat 
INFILEfile2.dat 
INFILEfile3.dat 
APPEND 
INTOTABLEemp 
(empnoPOSITION(1:4)INTEGEREXTERNAL, 
enamePOSITION(6:15)CHAR, 
deptnoPOSITION(17:18)CHAR, 
mgrPOSITION(20:23)INTEGEREXTERNAL 
)

13、将一个文件导入到不同的表

(1)、

LOADDATA 
INFILE* 
INTOTABLEtab1WHENtab='tab1' 
(tabFILLERCHAR(4), 
col1INTEGER 
) 
INTOTABLEtab2WHENtab='tab2' 
(tabFILLERPOSITION(1:4), 
col1INTEGER 
) 
BEGINDATA 
tab1|1 
tab1|2 
tab2|2 
tab3|3 
==============

(2)、

LOADDATA 
INFILE'mydata.dat' 
REPLACE 
INTOTABLEemp 
WHENempno!='' 
(empnoPOSITION(1:4)INTEGEREXTERNAL, 
enamePOSITION(6:15)CHAR, 
deptnoPOSITION(17:18)CHAR, 
mgrPOSITION(20:23)INTEGEREXTERNAL 
) 
INTOTABLEproj 
WHENprojno!='' 
(projnoPOSITION(25:27)INTEGEREXTERNAL, 
empnoPOSITION(1:4)INTEGEREXTERNAL 
)

14、过滤掉的数据文件路径指定

/opt/app/oracle/product/10.2.0/bin/sqlldrAPS/APScontrol=/home/oracle/APS_LOAD/ctl/AP_CONTRACT.CTLLOG=/home/oracle/APS_LOAD/log/$yesterday/AP_CONTRACT_$yesterday.logbad=/home/oracle/APS_LOAD/bad/DUE_BILL_$yesterday.badrows=10000readsize=20000000bindsize=20000000DISCARD=/home/oracle/APS_LOAD/bad/discard_ts.dis

15、附:测试用控制文件

LOADDATA 
INFILE'/home/oracle/APS_LOAD/dat/APS_AP_CONTRACT.dat' 
TRUNCATE 
INTOTABLEAP_CONTRACT 
WHEN(01)<>'1' 
FIELDSTERMINATEDBY"|" 
TRAILINGNULLCOLS 
( 
AGMT_NO"(TRIM(:AGMT_NO))", 
CONTRACT_NOFILLER,--"(TRIM(:CONTRACT_NO))", 
LOAN_AMT"(TRIM(:LOAN_AMT))", 
AGMT_HOLDER"(TRIM(:AGMT_HOLDER))", 
LOAN_TYPE_CD"(TRIM(:LOAN_TYPE_CD))", 
CURR_CD"(TRIM(:CURR_CD))", 
BALANCE"(TRIM(:BALANCE))", 
LOAN_DIRC_CD"(TRIM(:LOAN_DIRC_CD))", 
AGMT_START_DATE"(TRIM(:AGMT_START_DATE))", 
AGMT_END_DATE"(TRIM(:AGMT_END_DATE))", 
AGMT_BELONG_ORG_NO"(TRIM(:AGMT_BELONG_ORG_NO))", 
MANAGER_NO"(TRIM(:MANAGER_NO))", 
PROCESS_RATE"(TRIM(:PROCESS_RATE))", 
INSURE_METH_TYPE_CD"(TRIM(:INSURE_METH_TYPE_CD))", 
AGMT_SIGN_DATE"(TRIM(:AGMT_SIGN_DATE))", 
LOAN_PROP_CD"(TRIM(:LOAN_PROP_CD))", 
LOAN_USE_TYPE"(TRIM(:LOAN_USE_TYPE))", 
ENTRUST_LOAN_FLAG"(TRIM(:ENTRUST_LOAN_FLAG))", 
ENTRUST_NAME"(TRIM(:ENTRUST_NAME))", 
FARM_LOAN_FLAG"(TRIM(:FARM_LOAN_FLAG))", 
FARM_LOAN_TYPE_CD"(TRIM(:FARM_LOAN_TYPE_CD))", 
LOAN_BIZ_TYPE_CD"(TRIM(:LOAN_BIZ_TYPE_CD))", 
ID_TESTRECNUM, 
CHAR_TESTCONSTANT'31', 
SQ"sqlldr.nextval", 
TEST_4"TO_CHAR(SYSDATE,'YYYYMMDDHH24:MI:SS')", 
TEST_5"(TRIM(:LOAN_BIZ_TYPE_CD)||'---'||TRIM(:AGMT_NO))" 
)

本文来源:1818IP

本文地址:https://www.1818ip.com/post/10710.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。