關於 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 |
|
||||
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 | |||||
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 | |||||
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. | |||||
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. | |||||
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). | |||||
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 | |||||
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 | |||||
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. | |||||
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 | |||||
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 | |||||
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 | |||||
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 | |||||
|
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 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