快速導入導出Oracle數據demo(sqlldr、UTL_FILE)

本文演示快速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

邀月工做室

相關文章
相關標籤/搜索