閱讀241 返回首頁    go 阿裏雲 go 技術社區[雲棲]


關於 Oracle 的數據導入導出及 Sql Loader (sqlldr) 的用法

在 Oracle 數據庫中,我們通常在不同數據庫的表間記錄進行複製或遷移時會用以下幾種方法:

1. A 表的記錄導出為一條條分號隔開的 insert 語句,然後執行插入到 B 表中
2. 建立數據庫間的 dblink,然後用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where ...
3. exp A 表,再 imp 到 B 表,exp 時可加查詢條件
4. 程序實現 select from A ..,然後 insert into B ...,也要分批提交
5. 再就是本篇要說到的 Sql Loader(sqlldr) 來導入數據,效果比起逐條 insert 來很明顯

第 1 種方法在記錄多時是個噩夢,需三五百條的分批提交,否則客戶端會死掉,而且導入過程很慢。如果要不產生 REDO 來提高 insert into 的性能,就要下麵那樣做:

1.alter table B nologging;
2.insert /* +APPEND */ into B(c1,c2) values(x,xx);
3.insert /* +APPEND */ into B select * from A@dblink where .....;


好啦,前麵簡述了 Oracle 中數據導入導出的各種方法,我想一定還有更高明的。下麵重點講講 Oracle  的 Sql Loader (sqlldr) 的用法。

在命令行下執行 Oracle  的 sqlldr 命令,可以看到它的詳細參數說明,要著重關注以下幾個參數:

userid -- Oracle 的 username/password[@servicename]
control -- 控製文件,可能包含表的數據
-------------------------------------------------------------------------------------------------------
log -- 記錄導入時的日誌文件,默認為 控製文件(去除擴展名).log
bad -- 壞數據文件,默認為 控製文件(去除擴展名).bad
data -- 數據文件,一般在控製文件中指定。用參數控製文件中不指定數據文件更適於自動操作
errors -- 允許的錯誤記錄數,可以用他來控製一條記錄都不能錯
rows -- 多少條記錄提交一次,默認為 64
skip -- 跳過的行數,比如導出的數據文件前麵幾行是表頭或其他描述

還有更多的 sqlldr 的參數說明請參考:sql loader的用法

用例子來演示 sqlldr 的使用,有兩種使用方法:

1. 隻使用一個控製文件,在這個控製文件中包含數據
2. 使用一個控製文件(作為模板) 和一個數據文件

一般為了利於模板和數據的分離,以及程序的不同分工會使用第二種方式,所以先來看這種用法。數據文件可以是 CSV 文件或者以其他分割符分隔的,數據文件可以用 PL/SQL Developer 或者 Toad 導出,也可以用 SQL *Plus 的  spool 格式化產出,或是 UTL_FILE 包生成。另外,用 Toad 還能直接生成包含數據的控製文件。

首先,假定有這麼一個表 users,並插入五條記錄:

1.create table users(
2.    user_id number,           --用戶 ID
3.    user_name varchar2(50),   --用戶名
4.    login_times number,       --登陸次數
5.    last_login date           --最後登錄日期
6.)

 

1.insert into users values(1,'Unmi',3,sysdate);
2.insert into users values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD'));
3.insert into users values(3,'隔葉黃鶯',8,to_date('2009-01-02','YYYY-MM-DD'));
4.insert into users values(4,'Kypfos',NULL,NULL);
5.insert into users values(5,'不知秋',1,to_date('2008-12-23','YYYY-MM-DD'));


第二種方式: 使用一個控製文件(作為模板) 和一個數據文件

1) 建立數據文件,我們這裏用 PL/SQL Developer 導出表 users 的記錄為 users_data.csv 文件,內容如下:

1."   ","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN"
2."1","1","Unmi","3","2009-1-5 20:34:44"
3."2","2","","5","2008-10-15"
4."3","3","隔葉黃鶯","8","2009-1-2"
5."4","4","Kypfos","",""
6."5","5","不知秋","1","2008-12-23"


2) 建立一個控製文件 users.ctl,內容如下:

01.OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的選項可以寫到這裏邊來,skip=1 用來跳過數據中的第一行
02.LOAD DATA
03.INFILE "users_data.csv" --指定外部數據文件,可以寫多個 INFILE "another_data_file.csv" 指定多個數據文件
04.--這裏還可以使用 BADFILE、DISCARDFILE 來指定壞數據和丟棄數據的文件,
05.truncate --操作類型,用 truncate table 來清除表中原有記錄
06.INTO TABLE users -- 要插入記錄的表
07.Fields terminated by "," -- 數據中每行記錄用 "," 分隔
08.Optionally enclosed by '"' -- 數據中每個字段用 '"' 框起,比如字段中有 "," 分隔符時
09.trailing nullcols --表的字段沒有對應的值時允許為空
10.(
11.  virtual_column FILLER, --這是一個虛擬字段,用來跳過由 PL/SQL Developer 生成的第一列序號
12.  user_id number, --字段可以指定類型,否則認為是 CHARACTER 類型, log 文件中有顯示
13.  user_name,
14.  login_times,
15.  last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相當用 to_date() 函數轉換
16.)


說明:在操作類型 truncate 位置可用以下中的一值:

1) insert     --為缺省方式,在數據裝載開始時要求表為空
2) append  --在表中追加新記錄
3) replace  --刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄
4) truncate --刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄

3) 執行命令:

sqlldr dbuser/dbpass@dbservice control=users.ctl

在 dbservice 指示的數據庫的表 users 中記錄就和數據文件中的一樣了。

執行完 sqlldr 後希望能留意一下生成的幾個文件,如 users.log 日誌文件、users.bad 壞數據文件等。特別是要看看日誌文件,從中可讓你更好的理解 Sql Loader,裏麵有對控製文件的解析、列出每個字段的類型、加載記錄的統計、出錯原因等信息。

第一種方式,隻使用一個控製文件在這個控製文件中包含數據

1) 把 users_data.cvs 中的內容補到 users.ctl 中,並以 BEGINDATA 連接,還要把 INFILE "users_data.csv" 改為 INFILE *。同時為了更大化的說明問題,把數據處理了一下。此時,完整的 users.ctl 文件內容是:

01.OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的選項可以寫到這裏邊來,skip=1 用來跳過數據中的第一行
02.LOAD DATA
03.INFILE *  -- 因為數據同控製文件在一起,所以用 * 表示
04.append    -- 這裏用了 append 來操作,在表 users 中附加記錄 
05.INTO TABLE users
06.when LOGIN_TIMES<>'8'  -- 還可以用 when 子句選擇導入符合條件的記錄
07.Fields terminated by ","
08.trailing nullcols
09.(
10.  virtual_column FILLER, --跳過由 PL/SQL Developer 生成的第一列序號
11.  user_id "user_seq.nextval", --這一列直接取序列的下一值,而不用數據中提供的值
12.  user_name "'Hi '||upper(:user_name)",--,還能用SQL函數或運算對數據進行加工處理
13.  login_times terminated by ",", NULLIF(login_times='NULL') --可為列單獨指定分隔符
14.  last_login DATE "YYYY-MM-DD HH24:MI:SS" NULLIF (last_login="NULL") -- 當字段為"NULL"時就是 NULL
15.)
16.BEGINDATA --數據從這裏開始
17.   ,USER_ID,USER_NAME,LOGIN_TIMES,LAST_LOGIN
18.1,1,Unmi,3,2009-1-5 20:34
19.2,2,Fantasia,5,2008-10-15
20.3,3,隔葉黃鶯,8,2009-1-2
21.4,4,Kypfos,NULL,NULL
22.5,5,不知秋,1,2008-12-23


2) 執行一樣的命令:

sqlldr dbuser/dbpass@dbservice control=users.ctl

比如,在控製台會顯示這樣的信息:

C:/>sqlldr dbuser/dbpass@dbservice control=users.ctl

 

SQL*Loader: Release 9.2.0.1.0 - Production on 星期三 1月 7 22:26:25 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

達到提交點,邏輯記錄計數4
達到提交點,邏輯記錄計數5

上麵的控製文件包含的內容比較複雜(演示目的),請根據注釋理解每個參數的意義。還能由此發掘更多用法。

最後說下有關 SQL *Loader 的性能與並發操作

1) ROWS 的默認值為 64,你可以根據實際指定更合適的 ROWS 參數來指定每次提交記錄數。(體驗過在 PL/SQL Developer 中一次執行幾條條以上的 insert 語句的情形嗎?)

2)常規導入可以通過使用 INSERT語句來導入數據。Direct導入可以跳過數據庫的相關邏輯(DIRECT=TRUE),而直接將數據導入到數據文件中,可以提高導入數據的性能。當然,在很多情況下,不能使用此參數(如果主鍵重複的話會使索引的狀態變成UNUSABLE!)。

3) 通過指定 UNRECOVERABLE選項,可以關閉數據庫的日誌(是否要 alter table table1 nologging 呢?)。這個選項隻能和 direct 一起使用。

4) 對於超大數據文件的導入就要用並發操作了,即同時運行多個導入任務.

  sqlldr   userid=/   control=result1.ctl   direct=true   parallel=true  
  sqlldr   userid=/   control=result2.ctl   direct=true   parallel=true  
  sqlldr   userid=/   control=result2.ctl   direct=true   parallel=true  

  當加載大量數據時(大約超過10GB),最好抑製日誌的產生:  
 
  SQL>ALTER   TABLE   RESULTXT   nologging;
 
  這樣不產生REDO LOG,可以提高效率。然後在 CONTROL 文件中 load data 上麵加一行:unrecoverable,  此選項必須要與DIRECT共同應用。  
 
  在並發操作時,ORACLE聲稱可以達到每小時處理100GB數據的能力!其實,估計能到 1-10G 就算不錯了,開始可用結構 相同的文件,但隻有少量數據,成功後開始加載大量數據,這樣可以避免時間的浪費。

General
Note: This page consists of a series of demonstrations of various SQL*Loader capabilities. It is by no means complete.

For the Oracle doc:
https://download-west.oracle.com/docs/cd/B19306_01/server.102/b14215/app_ldr_syntax.htm
SQL Loader Data Types CHAR
DECIMAL EXTERNAL
INTEGER EXTERNAL
Modes APPEND
INSERT
REPLACE
TRUNCATE
INFILE INFILE * or INFILE '<file_name>'
[RECSIZE <integer> BUFFERS <integer>]
INFILE 'mydata.dat' "RECSIZE 80 BUFFERS 8"
INTO INTO <table_name>
INTO TABLE emp
BADFILE

Records with formatting errors or that cause Oracle errors
BADFILE '<file_name>'
BADFILE 'sample.bad'
DISCARDFILE

Records not satisfying a WHEN clause
DISCARDFILE '<file_name>'
DISCARDMAX <integer>
DISCARDFILE 'sample.dsc'
CHARACTERSET CHARACTERSET <character_set_name>
CHARACTERSET WE8MSWIN1252
LENGTH LENGTH SEMANTICS <BYTE | CHAR>
LENGTH SEMANTICS BYTE
-- this is the default for all character sets except UTF16
LOAD TYPES APPEND
INSERT
REPLACE
TRUNCATE
APPEND
OPTIONS CLAUSE BINDSIZE = n
COLUMNARRAYROWS = n
DIRECT = {TRUE | FALSE} 
ERRORS = n
LOAD = n 
MULTITHREADING = {TRUE | FALSE}
PARALLEL = {TRUE | FALSE}
READSIZE = n
RESUMABLE = {TRUE | FALSE}
RESUMABLE_NAME = 'text string'
RESUMABLE_TIMEOUT = n
ROWS = n 
SILENT = {HEADER | FEEDBACK | ERRORS | DISCARDS | PARTITIONS | ALL}
SKIP = n 
SKIP_INDEX_MAINTENANCE = {TRUE | FALSE}
SKIP_UNUSABLE_INDEXES = {TRUE | FALSE}
STREAMSIZE = n
OPTIONS (BINDSIZE=100000, SILENT=(ERRORS, FEEDBACK))
PATHS CONVENTIONAL PATH
DIRECT PATH

All loads demonstrated below are convention with the exception of demo 6.
 
TERMINATORS
Comma

','

Tab 0x'09'
TRAILING NULLCOLS TRAILING NULLCOLS
-- assuming this data
10 Accounting

-- the following
INTO TABLE dept 
TRAILING NULLCOLS 
( deptno CHAR TERMINATED BY " ", 
dname CHAR TERMINATED BY WHITESPACE, 
loc CHAR TERMINATED BY WHITESPACE) 

-- would generate an error without TRAILING NULLCOLS 
-- as it doesn't have loc data
WHEN WHEN <condition>
See Demo 5 below
 
Assembling Logical Records
CONCATENATE CONCATENATE <number_of_physical_records>
CONCATENATE 3
CONTINUEIF CONTINUEIF THIS [PRESERVE] (start_position:end_position) = value
CONTINUEIF THIS (1:2) = '%%'

CONTINUEIF THIS PRESERVE (1:2) = '%%'
CONTINUEIF CONTINUEIF NEXT [PRESERVE] (start_position:end_position) = value
CONTINUEIF NEXT (1:2) = '%%'

CONTINUEIF NEXT PRESERVE (1:2) = '%%'
CONTINUEIF CONTINUEIF LAST (start_position:end_position) = value
-- Tests against the last non-blank character.
-- Allows only a single character for the test
PRESERVE Preserves the CONTINUEIF characters
 
Demo Tables & Data

Demo Tables
CREATE TABLE dept (
deptno   VARCHAR2(2),
dname    VARCHAR2(20),
loc      VARCHAR2(20));

CREATE TABLE emp (
empno    NUMBER(4),
ename    VARCHAR2(10),
job      VARCHAR2(10),
mgr      NUMBER(4),
hiredate DATE,
sal      NUMBER(8,2),
comm     NUMBER(7,2),
deptno   NUMBER(2),
projno   NUMBER(4),
loadseq  NUMBER(3));

CREATE TABLE proj (
emp      NUMBER(4),
projno   NUMBER(3));

CREATE TABLE funcdemo (
last_name  VARCHAR2(20),
first_name VARCHAR2(20));

CREATE TABLE decodemo (
fld1    VARCHAR2(20),
fld2    VARCHAR2(20));

CREATE TABLE denver_prj (
projno  VARCHAR2(3),
empno   NUMBER(5),
projhrs NUMBER(2));

CREATE TABLE orlando_prj (
projno  VARCHAR2(3),
empno   NUMBER(5),
projhrs NUMBER(2));

CREATE TABLE misc_prj (
projno  VARCHAR2(3),
empno   NUMBER(5),
projhrs NUMBER(2));

CREATE TABLE po_tab OF XMLTYPE;

CREATE TABLE loadnums(
col1 VARCHAR2(10),
col2 NUMBER);
 
Demo 1
Basic import of delimited data with data in the control file

Control File

OPTIONS (ERRORS=500, SILENT=(FEEDBACK))
LOAD DATA
INFILE *
INTO TABLE <table_name>
FIELDS TERMINATED BY <delimiter>
OPTIONALLY ENCLOSED BY <enclosing character>
(<column_name>, <column_name>, <column_name>)
sqlldr userid=uwclass/uwclass control=c:/load/demo01.ctl log=d:/load/demo01.log
 
Demo 2
Basic import of fixed length data with separate data and control files

Control File

Data File

LOAD DATA
INFILE <data_file_path_and_name>
INTO TABLE <table_name> (
<column_name> POSITION(<integer>:<integer>) <data_type>,
<column_name> POSITION(<integer>:<integer>) <data_type>,
<column_name> POSITION(<integer>:<integer>) <data_type>)
sqlldr userid=uwclass/uwclass control=c:/load/demo02.ctl log=c:/load/demo02.log
 
Demo 3
Append of delimited data with data in the control file. This sample demonstrates date formating, delimiters within delimiters and implementation of record numbering with a SQL*Loader sequence. APPEND indicates that the table need not be empty before the SQL*Loader is run.

Control File

LOAD DATA
INFILE *
APPEND
INTO TABLE emp
FIELDS TERMINATED BY ","
OPTIONALLY ENCLOSED BY '"'
(<column_name>, <column_name> DATE "DD-Month-YYYY",
<column_name> CHAR TERMINATED BY ':',
<column_name> SEQUENCE(MAX,1))
sqlldr userid=uwclass/uwclass control=c:/load/demo03.ctl log=c:/load/demo3.log
 
Demo 4
Replace of fixed length data with separate data and control file. This sample demonstrates specifying a discard file, the maximum number of records to discard (DISCARDMAX), and CONTINUEIF ( where it looks for an asterisk in the first position to determine if a new line has started.
Control File

Data File
LOAD DATA
INFILE 'c:/temp/demo04.dat'
DISCARDFILE 'c:/temp/demo4.dsc'
DISCARDMAX 999
REPLACE
CONTINUEIF THIS (1) = '*'

INTO TABLE emp (
empno    POSITION(1:4)   INTEGER EXTERNAL,
ename    POSITION(6:15)  CHAR,
hiredate POSITION(52:60) INTEGER EXTERNAL)
sqlldr userid=uwclass/uwclass control=c:/load/demo04.ctl log=c:/load/demo4.log
 
Demo 5
Loading into multiple tables during an import using the WHEN keyword. The control file loads two different tables making three passes at one of them. Note the problem with the Doolittle record and how it is handled.

Control File

Data File

LOAD DATA
INFILE 'c:/temp/demo05.dat'
BADFILE 'c:/temp/bad05.bad'
DISCARDFILE 'c:/temp/disc05.dsc'
REPLACE

INTO TABLE emp (
empno  POSITION(1:4)   INTEGER EXTERNAL,
ename  POSITION(6:15)  CHAR,
deptno POSITION(17:18) CHAR,
mgr    POSITION(20:23) INTEGER EXTERNAL)

--1st project: proj has two columns, both not null
INTO TABLE proj
WHEN projno != ' ' (
emp    POSITION(1:4)   INTEGER EXTERNAL,
projno POSITION(25:27) INTEGER EXTERNAL)

-- 2nd project
INTO TABLE proj
WHEN projno != ' ' (
emp    POSITION(1:4)   INTEGER EXTERNAL,
projno POSITION(29:31) INTEGER EXTERNAL)

-- 3rd project
INTO TABLE proj
WHEN projno != ' ' (
emp    POSITION(1:4)   INTEGER EXTERNAL,
projno POSITION(33:35) INTEGER EXTERNAL)
sqlldr userid=uwclass/uwclass control=c:/load/demo5.ctl log=d:/load/demo5.log
 
Demo 6
Using the NULLIF and BLANKS keywords to handle zero length strings being loaded into numeric columns. Also note the use of Direct Path Load in the control file (DIRECT=TRUE).

Control File

Data File

LOAD DATA
INFILE 'c:/temp/demo06.dat'
INSERT
INTO TABLE emp
-- SORTED INDEXES (emp_empno)
(
empno  POSITION(01:04) INTEGER EXTERNAL NULLIF empno=BLANKS,
ename  POSITION(06:15) CHAR,
job    POSITION(17:25) CHAR,
mgr    POSITION(27:30) INTEGER EXTERNAL NULLIF mgr=BLANKS,
sal    POSITION(32:39) DECIMAL EXTERNAL NULLIF sal=BLANKS,
comm   POSITION(41:48) DECIMAL EXTERNAL NULLIF comm=BLANKS,
deptno POSITION(50:51) INTEGER EXTERNAL NULLIF deptno=BLANKS)
sqlldr userid=uwclass/uwclass control=c:/load/demo06.ctl log=c:/load/demo06.log DIRECT=TRUE
 
Demo 7
Using a buit-in function to modify data during loading

Control File

LOAD DATA
INFILE *
INSERT
INTO TABLE funcdemo
(
LAST_NAME  position(1:7)  CHAR "UPPER(:LAST_NAME)",
FIRST_NAME position(8:15) CHAR "LOWER(:FIRST_NAME)"
)
BEGINDATA
Locke Phil
Gorman Tim
sqlldr userid=uwclass/uwclass control=c:/load/demo07.ctl log=c:/load/demo07.log
 
Demo 8
Another example of using a built-in function, in this case DECODE, to modify data during loading

Control File

LOAD DATA
INFILE *
INSERT
INTO TABLE decodemo
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
(
fld1, 
fld2 "DECODE(:fld1, 'hello', 'goodbye', :fld1)"
)
BEGINDATA
hello,""
goodbye,""
this is a test,""
hello,""
sqlldr userid=uwclass/uwclass control=c:/load/demo08.ctl log=c:/load/demo08.log
 
Demo 9
Loading multiple files into multiple tables in a singe control file. Note the use of the WHEN keyword.

Control File

Data File

Data File

LOAD DATA
INFILE 'c:/temp/demo09a.dat'
INFILE 'c:/temp/demo09b.dat'

APPEND
INTO TABLE denver_prj
WHEN projno = '101' (
projno  position(1:3)  CHAR,
empno   position(4:8)  INTEGER EXTERNAL,
projhrs position(9:10) INTEGER EXTERNAL)

INTO TABLE orlando_prj
WHEN projno = '202' (
projno  position(1:3)  CHAR,
empno   position(4:8)  INTEGER EXTERNAL,
projhrs position(9:10) INTEGER EXTERNAL)

INTO TABLE misc_prj
WHEN projno != '101' AND projno != '202' (
projno  position(1:3)  CHAR,
empno   position(4:8)  INTEGER EXTERNAL,
projhrs position(9:10) INTEGER EXTERNAL)
sqlldr userid=uwclass/uwclass control=c:/load/demo09.ctl log=c:/load/demo09.log
 
Demo 10
Loading negative numeric values. Note Clark and Miller's records in the data file. Note empty row

Control File

Data File

LOAD DATA
INFILE 'c:/temp/demo10.dat'
INTO TABLE emp
REJECT ROWS WITH ALL NULL FIELDS
(
empno  POSITION(01:04) INTEGER EXTERNAL,
ename  POSITION(06:15) CHAR,
job    POSITION(17:25) CHAR,
mgr    POSITION(27:30) INTEGER EXTERNAL,
sal    POSITION(32:39) DECIMAL EXTERNAL,
comm   POSITION(41:48) DECIMAL EXTERNAL,
deptno POSITION(50:51) INTEGER EXTERNAL)
sqlldr userid=uwclass/uwclass control=c:/load/demo10.ctl log=c:/load/demo10.log
 
Demo 11
Loading XML

Control File

LOAD DATA
INFILE *
INTO TABLE po_tab
APPEND
XMLTYPE (xmldata)
FIELDS
(xmldata CHAR(2000))
desc po_tab

sqlldr userid=uwclass/uwclass control=c:/load/demo11.ctl log=c:/load/demo11.log

set long 1000000

SELECT * FROM po_tab;

SELECT *
FROM po_tab
WHERE sys_nc_rowinfo$ LIKE '%Hurry%';
 
Demo 12
Loading a CONSTANT, RECNUM, and SYSDATE

Control File

OPTIONS (ERRORS=100, SILENT=(FEEDBACK))
LOAD DATA
INFILE *
REPLACE
INTO TABLE dept
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
(recno RECNUM, deptno CONSTANT "XX", dname, loc, tdate SYSDATE)
ALTER TABLE dept
ADD (recno NUMBER(5), tdate DATE);

desc dept

sqlldr userid=uwclass/uwclass control=c:/load/demo12.ctl log=c:/load/demo12.log
 
Demo 13
Setting READSIZE and BINDSIZE


The control file and data for 
this demo can be found in 
/demo/schema/sales_history/
schema under $ORACLE_HOME
as cust1v3.ctl and cust1v3.dat

BINDSIZE and READSIZE 
do not apply to Direct Path Loads

LOAD DATA
INFILE 'c:/temp/cust1v3.dat'
INTO TABLE CUSTOMERS
TRUNCATE
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
(CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME, CUST_GENDER, CUST_YEAR_OF_BIRTH, CUST_MARITAL_STATUS, CUST_STREET_ADDRESS, CUST_POSTAL_CODE, CUST_CITY, CUST_CITY_ID, CUST_STATE_PROVINCE, CUST_STATE_PROVINCE_ID, COUNTRY_ID, CUST_MAIN_PHONE_NUMBER, CUST_INCOME_LEVEL, CUST_CREDIT_LIMIT, CUST_EMAIL, CUST_TOTAL, CUST_TOTAL_ID, CUST_SRC_ID, CUST_EFF_FROM DATE(19) "YYYY-MM-DD-HH24-MI-SS", CUST_EFF_TO DATE(19) "YYYY-MM-DD-HH24-MI-SS", CUST_VALID)
conn sh/sh

GRANT select ON customers TO uwclass;

conn uwclass/uwclass

CREATE TABLE customers AS
SELECT * FROM sh.customers
WHERE 1=2;

desc customers

-- run 1 - default sizing
sqlldr userid=uwclass/uwclass control=c:/load/demo13.ctl log=c:/load/demo13.log

Space allocated for bind array: 251252 bytes(46 rows)
Read buffer bytes: 1048576
Elapsed time was: 00:00:03.73
CPU time was: 00:00:01.25

-- run 2 - double default to 2M
sqlldr userid=uwclass/uwclass control=c:/load/demo13.ctl log=c:/load/demo13.log readsize=2048000 bindsize=2048000 rows=64

Space allocated for bind array: 349568 bytes(64 rows)
Read buffer bytes: 2048000

Elapsed time was: 00:00:03.50
CPU time was: 00:00:01.09

-- run 3 - double default to 4M
sqlldr userid=uwclass/uwclass control=c:/load/demo13.ctl
log=c:/load/demo13.log readsize=4096000 bindsize=4096000 rows=64

Space allocated for bind array: 349568 bytes(64 rows)
Read buffer bytes: 4096000

Elapsed time was: 00:00:03.65
CPU time was: 00:00:01.12
 
Demo 14
Trailing


Load Numbers with trailing + and - signs

LOAD DATA
INFILE *
TRUNCATE
INTO TABLE loadnums (
col1 position(1:5),
col2 position(7:16) "TO_NUMBER(:col2,'99,999.99MI')")
BEGINDATA
abcde 1,234.99-
abcde 11,234.34+
abcde 45.23-
abcde 99,234.38-
abcde 23,234.23+
abcde 98,234.23+
sqlldr userid=uwclass/uwclass control=c:/load/demo14.ctl log=c:/load/demo09.log

最後更新:2017-04-02 06:51:22

  上一篇:go magento -- 結賬時默認選中其中一種配送方式
  下一篇:go 數據庫水平切分的實現原理解析