程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫SqlLoad常用技巧總結

Oracle數據庫SqlLoad常用技巧總結

編輯:Oracle數據庫基礎

Oracle數據庫SqlLoad常用技巧的相關知識是本文我們主要要介紹的內容,本文我們總結了14種SqlLoad的使用技巧,並給出了測試用的文件源碼,接下來我們就開始一一介紹這部分內容,希望能夠對您有所幫助。

1、控制文件中注釋用“--”。

2、為防止導入出現中文亂碼,在控制文件中加入字符集控制

  1. LOAD DATA  
  2. CHARACTERSET ZHS16GBK  

3、讓某一列成為行號,用RECNUM關鍵字

  1. load data      
  2. infile *      
  3. into table t      
  4. replace      
  5. ( seqno RECNUM //載入每行的行號      
  6. text Position(1:1024))      
  7. BEGINDATA      
  8. fsdfasj  

4、過濾某一列,用FILLER關鍵字

  1. LOAD DATA    
  2. TRUNCATE INTO TABLE T1    
  3. FIELDS TERMINATED BY ','    
  4. ( fIEld1,    
  5. fIEld2 FILLER,    
  6. fIEld3    
  7. )   

5、過濾行

在INTO TABLE table_name後加WHEN過濾條件,但功能有限,如果以豎線分隔符的文件,不能實現字段級的過濾,定長的還好。

  1. LOAD DATA    
  2. INFILE 'mydata.dat'    
  3. BADFILE 'mydata.bad'    
  4. DISCARDFILE 'mydata.dis'    
  5. APPEND    
  6. INTO TABLE my_selective_table    
  7. WHEN (01) <> 'H' and (01) <> 'T' and (30:37) = '20031217'    
  8. (    
  9. region              CONSTANT '31',    
  10. service_key         POSITION(01:11)   INTEGER EXTERNAL,    
  11. call_b_no           POSITION(12:29)   CHAR    
  12. )   

6、過濾首行,用OPTIONS (SKIP 1)選項,也可以寫在命令行中,如:

sqlldr sms/admin control=test.ctl skip=1  

7、TRAILING NULLCOLS的使用,作用是表的字段沒有對應的值時允許為空

如:

  1. LOAD DATA      
  2. INFILE *      
  3. INTO TABLE DEPT      
  4. REPLACE      
  5. FIELDS TERMINATED BY ','      
  6. TRAILING NULLCOLS // 其實下面的ENTIRE_LINE在BEGINDATA後面的數據中是沒有直接對應的列的值的如果第一行改為 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了      
  7. (DEPTNO,      
  8. DNAME "upper(:dname)", // 使用函數      
  9. LOC "upper(:loc)",      
  10. LAST_UPDATED date 'dd/mm/yyyy', // 日期的一種表達方式 還有'dd-mon-yyyy' 等      
  11. ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"      
  12. )      
  13. BEGINDATA      
  14. 10,Sales,Virginia,1/5/2000      
  15. 20,Accounting,Virginia,21/6/1999      
  16. 30,Consulting,Virginia,5/1/2000      
  17. 40,Finance,Virginia,15/3/2001  

8、添加、修改數據

(1)、  

  1. LOAD DATA    
  2. INFILE *    
  3. INTO TABLE tmp_test    
  4. ( rec_no                      "my_db_sequence.nextval",    
  5. region                      CONSTANT '31',    
  6. time_loaded                 "to_char(SYSDATE, 'HH24:MI')",    
  7. data1        POSITION(1:5) ":data1/100",    
  8. data2        POSITION(6:15) "upper(:data2)",    
  9. data3        POSITION(16:22)"to_date(:data3, 'YYMMDD')"    
  10. )    
  11. BEGINDATA    
  12. 11111AAAAAAAAAA991201    
  13. 22222BBBBBBBBBB990112  

(2)、  

  1. LOAD DATA    
  2. INFILE 'mail_orders.txt'    
  3. BADFILE 'bad_orders.txt'    
  4. APPEND    
  5. INTO TABLE mailing_list    
  6. FIELDS TERMINATED BY ","    
  7. ( addr,    
  8. city,    
  9. state,    
  10. zipcode,    
  11. mailing_addr   "decode(:mailing_addr, null, :addr, :mailing_addr)",    
  12. mailing_city   "decode(:mailing_city, null, :city, :mailing_city)",    
  13. mailing_state    
  14. )   

9、合並多行記錄為一行記錄

通過關鍵字concatenate 把幾行的記錄看成一行記錄:

  1. LOAD DATA      
  2. INFILE *      
  3. concatenate 3 // 通過關鍵字concatenate 把幾行的記錄看成一行記錄      
  4. INTO TABLE DEPT      
  5. replace      
  6. FIELDS TERMINATED BY ','      
  7. (DEPTNO,      
  8. DNAME "upper(:dname)",      
  9. LOC "upper(:loc)",      
  10. LAST_UPDATED date 'dd/mm/yyyy'      
  11. )      
  12. BEGINDATA      
  13. 10,Sales, // 其實這3行看成一行 10,Sales,Virginia,1/5/2000      
  14. Virginia,      
  15. 1/5/2000  

10、用”|+|”分隔符,避免數據混淆:fIElds terminated by "|+|"

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

如下:

  1. LOAD DATA    
  2. INFILE *    
  3. append    
  4. INTO TABLE tmp_test    
  5. FIELDS TERMINATED BY ","    
  6. OPTIONALLY ENCLOSED BY '"'    
  7. TRAILING NULLCOLS    
  8. ( data1,    
  9. data2    
  10. )    
  11. BEGINDATA    
  12. 11111,AAAAAAAAAA    
  13. 22222,"A,B,C,D,"   

12、一次導入多個文件到同一個表

  1. LOAD DATA    
  2. INFILE file1.dat    
  3. INFILE file2.dat    
  4. INFILE file3.dat    
  5. APPEND    
  6. INTO TABLE emp    
  7. ( empno POSITION(1:4)   INTEGER EXTERNAL,    
  8. ename POSITION(6:15) CHAR,    
  9. deptno POSITION(17:18) CHAR,    
  10. mgr    POSITION(20:23) INTEGER EXTERNAL    
  11. )  

13、將一個文件導入到不同的表

(1)、  

  1. LOAD DATA    
  2. INFILE *    
  3. INTO TABLE tab1 WHEN tab = 'tab1'    
  4. ( tab FILLER CHAR(4),    
  5. col1 INTEGER    
  6. )    
  7. INTO TABLE tab2 WHEN tab = 'tab2'    
  8. ( tab FILLER POSITION(1:4),    
  9. col1 INTEGER    
  10. )    
  11. BEGINDATA    
  12. tab1|1    
  13. tab1|2    
  14. tab2|2    
  15. tab3|3    
  16. ==============  

(2)、  

  1. LOAD DATA    
  2. INFILE 'mydata.dat'    
  3. REPLACE    
  4. INTO TABLE emp    
  5. WHEN empno != ' '    
  6. ( empno POSITION(1:4)   INTEGER EXTERNAL,    
  7. ename POSITION(6:15) CHAR,    
  8. deptno POSITION(17:18) CHAR,    
  9. mgr    POSITION(20:23) INTEGER EXTERNAL    
  10. )    
  11. INTO TABLE proj    
  12. WHEN projno != ' '    
  13. ( projno POSITION(25:27) INTEGER EXTERNAL,    
  14. empno POSITION(1:4)   INTEGER EXTERNAL    
  15. )   

14、過濾掉的數據文件路徑指定

  1. /opt/app/Oracle/product/10.2.0/bin/sqlldr APS/APS control=/home/Oracle/APS_LOAD/ctl/AP_CONTRACT.CTL LOG=/home/Oracle/APS_LOAD/log/$yesterday/AP_CONTRACT_$yesterday.log bad=/home/Oracle/APS_LOAD/bad/DUE_BILL_$yesterday.bad rows=10000 readsize=20000000 bindsize=20000000  DISCARD=/home/Oracle/APS_LOAD/bad/discard_ts.dis 

15、附:測試用控制文件

  1. LOAD DATA    
  2. INFILE '/home/Oracle/APS_LOAD/dat/APS_AP_CONTRACT.dat'    
  3. TRUNCATE    
  4. INTO TABLE AP_CONTRACT    
  5. WHEN (01)<>'1'    
  6. FIELDS TERMINATED BY "|"    
  7. TRAILING NULLCOLS    
  8. (    
  9. AGMT_NO                  "(TRIM(:AGMT_NO               ))",        
  10. CONTRACT_NO         FILLER, --     "(TRIM(:CONTRACT_NO           ))",     
  11. LOAN_AMT                 "(TRIM(:LOAN_AMT              ))",    
  12. AGMT_HOLDER              "(TRIM(:AGMT_HOLDER           ))",    
  13. LOAN_TYPE_CD             "(TRIM(:LOAN_TYPE_CD          ))",    
  14. CURR_CD                  "(TRIM(:CURR_CD               ))",    
  15. BALANCE                  "(TRIM(:BALANCE               ))",    
  16. LOAN_DIRC_CD             "(TRIM(:LOAN_DIRC_CD          ))",    
  17. AGMT_START_DATE          "(TRIM(:AGMT_START_DATE       ))",    
  18. AGMT_END_DATE            "(TRIM(:AGMT_END_DATE         ))",    
  19. AGMT_BELONG_ORG_NO       "(TRIM(:AGMT_BELONG_ORG_NO    ))",    
  20. MANAGER_NO               "(TRIM(:MANAGER_NO            ))",    
  21. PROCESS_RATE             "(TRIM(:PROCESS_RATE          ))",    
  22. INSURE_METH_TYPE_CD      "(TRIM(:INSURE_METH_TYPE_CD   ))",    
  23. AGMT_SIGN_DATE           "(TRIM(:AGMT_SIGN_DATE        ))",    
  24. LOAN_PROP_CD             "(TRIM(:LOAN_PROP_CD          ))",    
  25. LOAN_USE_TYPE            "(TRIM(:LOAN_USE_TYPE         ))",    
  26. ENTRUST_LOAN_FLAG        "(TRIM(:ENTRUST_LOAN_FLAG     ))",    
  27. ENTRUST_NAME             "(TRIM(:ENTRUST_NAME          ))",    
  28. FARM_LOAN_FLAG           "(TRIM(:FARM_LOAN_FLAG        ))",    
  29. FARM_LOAN_TYPE_CD        "(TRIM(:FARM_LOAN_TYPE_CD     ))",    
  30. LOAN_BIZ_TYPE_CD         "(TRIM(:LOAN_BIZ_TYPE_CD      ))",    
  31. ID_TEST                       RECNUM ,    
  32. CHAR_TEST                     CONSTANT '31',    
  33. SQ                        "sqlldr.nextval",    
  34. TEST_4                    "TO_CHAR(SYSDATE,'YYYYMMDD HH24:MI:SS')",    
  35. TEST_5                    "(TRIM(:LOAN_BIZ_TYPE_CD)||'---'||TRIM(:AGMT_NO))"    
  36. )   

關於Oracle數據庫SqlLoad常用技巧的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved