本文演示快速sqlldr導入、UTL_FILE導出Oracle表數據實例sql
表結構以下,演示數據約112萬,可自行準備。oracle
1 create table MemberPointDemo 2 ( 3 MEMBERID NUMBER(20) not null ,--會員ID 4 PointType VARCHAR2(20) not null,--積分類型 5 Points VARCHAR2(20),--積分 6 SDate VARCHAR2(20) not null,--積分記帳日期 7 Notes VARCHAR2(60)--備註 8 9 ); 10 -- Create/Recreate indexes 11 create index IDX_MEMBERID on MemberPointDemo (MEMBERID); 12 alter table MemberPointDemo 13 add constraint PK_MEMBER_OUT primary key (MEMBERID, PointType, SDate );
一、快速導入sqlldrapp
#### *******************最快導入***********************************************/ su - oracle export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" --裝載源表數據 sqlldr dbusrdms/******@DBDMS control=/home/oracle/memberpoint.ctl log=/home/oracle/2017_12_06_162045.log
memberpoint.ctl文件內容:工具
1 load data 2 infile '/home/oracle/2017_12_06_162045.CSV' 3 into table dbusrdms.MemberPointDemo append 4 fields terminated by ',' 5 (MEMBERID, PointType, Points, SDate, Notes)
csv文件格式:spa
MEMBERID,PointType,Points,SDate,Notes 9281776,1,219,2015-01-01,2015增長 8758055,1,356.00,2015-01-01,2015增長
以上導入112萬記錄大約在50秒內完成。3d
二、快速導入UTL_FILE.FOPENcode
1 /* ******************************* 導出爲csv文件最快******************/ 2 DECLARE 3 VSFILE UTL_FILE.FILE_TYPE; --定義用於接收文件句柄的類型 4 V_CNT NUMBER; --統計每一個文件加載行數 5 V_Date Varchar(20); 6 --字段列表 7 MEMBERID NUMBER(20); 8 PointType VARCHAR2(20); 9 Points VARCHAR2(20); 10 SDate VARCHAR2(20); 11 Notes VARCHAR2(60); 12 13 14 BEGIN 15 --DBMS_OUTPUT.ENABLE(1000000); -->避免報錯ORA-20000: ORU-10027: BUFFER OVERFLOW, LIMIT OF 10000 BYTES 16 17 --文件命名規則..把表數據時間當作文件命名... 18 V_Date := TO_CHAR(sysdate, 'YYYY_MM_dd_hh24MiSS'); 19 --開始打開文件,EXP_DIR爲對應的目錄 20 VSFILE := UTL_FILE.FOPEN('EXP_DIR', V_Date || '.CSV', 'W'); 21 22 --文件字段標頭打印 23 UTL_FILE.PUT_LINE(VSFILE,'MEMBERID,PointType,Points,SDate,Notes'); 24 --UTL_FILE.PUT_LINE(VSFILE, '會員ID,積分類型,積分,記帳日期,備註'); 25 26 --每一個文件加載行數[每次進入循環都賦值爲0].排除標頭部分 27 V_CNT := 0; 28 --將FOR循環查詢的內容 29 FOR SQL_ IN (SELECT MEMBERID, PointType, Points, SDate, Notes FROM MemberPointDemo) LOOP 30 --字段列表 31 MEMBERID := SQL_.MEMBERID; 32 PointType := SQL_.PointType; 33 Points := SQL_.Points; 34 SDate := SQL_.SDate; 35 Notes := SQL_.Notes; 36 37 38 ----UTL_FILE.PUT_LINE 若須要EXCEL格式,須要每字段用逗號隔開,,WINDOWS EXCEL工具打開默認就是EXCEL格式 39 UTL_FILE.PUT_LINE(VSFILE, MEMBERID || ',' || PointType || ',' || Points || ',' || SDate || ',' || Notes ); 40 --下面語句能夠輸出帶引號的格式 41 --UTL_FILE.PUT_LINE(VSFILE, '"'||MEMBERID || '","' || PointType || '","' || Points || '","' || SDate || '","' || Notes || '"'); 42 43 --計數器,每一條數據都循環+1 44 V_CNT := V_CNT + 1; 45 END LOOP; 46 47 --打印每一個文件 LOAD ROWS 48 DBMS_OUTPUT.PUT_LINE(V_Date || '.CSV文件LOAD ROWS:' || V_CNT); 49 50 --放在LOOP 後,不然報錯 ORA-29282: 文件 ID 無效/ORA-06512: 在 "SYS.UTL_FILE", LINE 878 51 --若不寫以下 強制輸出緩衝/關閉句柄,可能存在導出數據少於查詢條目 52 UTL_FILE.FFLUSH(VSFILE); 53 UTL_FILE.FCLOSE(VSFILE); 54 55 END;
以上,導出爲指定目錄下的CSV文件,112萬記錄,大約14秒。blog