INFILE
的用法
1)模糊導入多個數據的文件。 可以在文件名中使用通配符。 星號 (*) 表示復數字符,問號 (?) 表示單個字符。
INFILE 'emp*.dat'
INFILE 'm?emp.dat'
?2)如果不需要導入數據文件,控制文件中有數據,可用INFILE? *?
INFILE? *? (表示控制文件導入的數據在控制文件中,begindata以后。)
eg:
LOAD DATA
INFILE *
INTO TABLE DEPT
FIELDS TERMINATED BY ‘,’
(DEPTNO, DNAME, LOC)
?BEGINDATA
10,Sales,Yinginia
20,Acceounting,yirgina
3)在完整路徑 中指定的文件?datafile
?.dat
INFILE 'c:/topdir/subdir/datafile.dat'
4)指定多個數據文件
INFILE? mydat1.dat? BADFILE? ‘mydat1.bad’? DISCARDFILE ‘mydat1.dis’
INFILE? mydat2.dat
INFILE? mydat3.dat? BADFILE? ‘mydat3.bad’? DISCARDFILE ‘mydat3.dis’
INFILE? mydat4.dat? DISCARDMAX? 10 0
附加:
INFILE "e:\gnis\mi_deci.dat" --Windows
INFILE '/home/oracle/gnis/mi_deci.dat' --Unix
2、insert、append、replace、truncate
insert:在空表中插入數據,表中有數據會中止
append:在表數據后面追加數據
replace:替代表中數據,加載前會先刪除原表中的數據
truncate:
2-1 columns列語句
column_name POSITION (start:end) datatype
或者
column_name datatype TERMINATED BY ‘delim’ [OPTIONALLY ENCLOSED BY ‘delim’]
column_name [POSITION({start|*[+offset]}[{:|-}end])]
?[datatype] [PIECED]
?[NULLIF condition [AND condition...]]
?[DEFAULTIF condition [AND condition...]]
?["sql_expression"]
into table命令
INTO TABLE table_name [{PARTITION | SUBPARTITION} (partition_name)] {INSERT | REPLACE | TRUNCATE | APPEND} [SORTED [INDEXES] (index_list)] [SINGLEROW] [{INSERT | REPLACE | TRUNCATE | APPEND}] [OPTIONS (FILE=database_filename)] [REENABLE [DISABLED_CONSTRAINTS][EXCEPTIONS exception_table_name]] [WHEN field_conditions] [{OID(fieldname)|SID(fieldname)}] [FIELDS [delimiter_description]] [TRAILING [NULLCOLS] [SKIP skip_count] (field_list)
3.加載多個表,字段用逗號分隔開
LOAD DATA
INFILE ‘animal_feeding.csv’
APPEND
INTO TABLE animal_feeding
(
animal_id INTEGER EXTERNAL TERMINATED BY ‘,’,
feeding_date DATE “dd-mon-yyyy” TERMINATED BY ‘,’,
pounds_eaten DECIMAL EXTERNAL TERMINATED BY ‘,’
)
INTO TABLE animal_feeding_note
(
animal_id INTEGER EXTERNAL TERMINATED BY ‘,’,
feeding_date DATE “dd-mon-yyyy” TERMINATED BY ‘,’,
pounds_eaten FILLER DECIMAL EXTERNAL TERMINATED BY‘,’, 使用了FILLER關鍵字指定SQLLoader不加載此字段。
note CHAR TERMINATED BY ‘,’
OPTIONALLY ENCLOSED BY ‘“‘????? 界定符為雙引號,也就是“a”=> a;
)
3-1提供了多個數據文件,要導入同一張表
LOAD DATA
INFILE ldr_case8_1.dat
INFILE ldr_case8_2.dat
INFILE ldr_case8_3.dat
TRUNCATE INTO TABLE MANAGER
FIELDS TERMINATED BY ","
(MGRNO,MNAME,JOB)
3-2同一個數據文件,要導入不同表
待導入的數據文件如下:
BON SMITH CLEAK 3904
BON ALLEN SALER,M 2891
MGR 10 SMITH SALES MANAGER
MGR 11 ALLEN.W TECH MANAGER
TMP SMITH 7369 CLERK 800 20
TMP ALLEN 7499 SALESMAN 1600 30
需求是將以 MGR 開頭的記錄導入 MANAGER 表,以 BON 開頭的記錄導入 BONUS表,其他記錄存入廢棄文件中
創建控制文件如下:
LOAD DATA
INFILE ldr_case9.dat
DISCARDFILE ldr_case9.dsc
TRUNCATEINTO TABLE BONUSWHEN TAB= 'BON'(TAB FILLER POSITION(1:3),ENAME POSITION(5:9) ,JOB POSITION(*+1:18),SAL POSITION(*+1))INTO TABLE MANAGERWHEN TAB = 'MGR'(TAB FILLER POSITION(1:3),MGRNO POSITION(4:5) ,MNAME POSITION(7:13),JOB POSITION(*+1))
附加:
DATE的其他格式
4、描述定寬列POSITION (start:end) ????記錄的第一個字符總是位置1。 ?
(
animal_id POSITION (1:3) INTEGER EXTERNAL,
feeding_date POSITION (4:14) DATE “dd-mon-yyyy”,
pounds_eaten POSITION (15:19) ZONED (5,2),
note POSITION (20:99) CHAR
)
5、sqlloader文本的基本數據類型
CHAR?????????????? 標識字符數據。?不要將其與數據庫中使用的CHAR數據類型混淆。?兩者之間不存在任何關系。?如果要將數據加載到任何類型的文本字段中,如VARCHAR2、CHAR或CLOB,請使用SQL*Loader CHAR數據類型。?
DATE [“format”] ??????標識日期。?即使它是可選的,也要指定一種格式。?這樣,如果數據庫中的默認日期格式與您期望的不同,就可以避免出現問題。?
INTEGER EXTERNAL ???標識以字符形式存儲的整數值。?例如,字符串“123”是一個合法的INTEGER EXTERNAL值。?
DECIMAL EXTERNAL ??標識以字符形式存儲的數字值,該值可能包含小數點。?字符串" - 123.45 "是DECIMAL EXTERNAL值的一個很好的例子。?ZONED(精度,比例)?
6、NULLIF
如果您希望將空白字段視為null,則可以使用NULLIF子句來判斷SQL*Loader來做這個。?NULLIF子句出現在數據類型之后,并接受下面的形式: ?
NULLIF field_name=BLANKS
要定義animal_id,以便將空白值存儲為null,可以使用這個定義: ?
animal_id POSITION (1:3) INTEGER EXTERNAL NULLIF animal_id=BLANKS,
7、trailing nullcols? ?如要導入源文件此列內容為空,在導入到數據庫表中,此列內容就是null
...INTO TABLE animal_feeding
TRAILING NULLCOLS
(animal_id INTEGER EXTERNAL TERMINATED BY ‘,’,feeding_date DATE “dd-mon-yyyy” TERMINATED BY ‘,’,pounds_eaten DECIMAL EXTERNAL TERMINATED BY ‘,’,note CHAR TERMINATED BY ‘,’OPTIONALLY ENCLOSED BY ‘”’
)
8、數據類型
1.字符類型數據
CHAR[ (length)] [delimiter]
length缺省為 1.2.日期類型數據
DATE [ ( length)]['date_format' [delimiter]
使用to_date函數來限制。3.字符格式中的十進制
DECIMAL EXTERNAL [(length)] [delimiter]
用于常規格式的十進制數(不是二進制=> 一個位等于一個bit)。4.壓縮十進制格式數據
DECIMAL (digtial [,divcision])5.雙精度符點二進制
DOUBLE6.普通符點二進制
FLOAT7.字符格式符點數
FLOAT EXTERNAL [ (length) ] [delimiter]8.雙字節字符串數據
GRAPHIC [ (legth)]9.雙字節字符串數據
GRAPHIC EXTERNAL[ (legth)]10.常規全字二進制整數
INTEGER11.字符格式整數
INTEGER EXTERNAL12.常規全字二進制數據
SMALLINT13.可變長度字符串
VARCHAR14.可變雙字節字符串數據
VARGRAPHIC15.RAW
16.VARRAWC
9、錯誤數據
INFILE ‘animal_feeding.csv’
BADFILE ‘animal_feeding_bad.bad’
10、CONCATENATE n ??將n行數據合并看成一行數據
LOAD DATA
INFILE ‘animal_feeding_concat.csv’
BADFILE ‘animal_feeding_concat’
APPEND
CONCATENATE 2
.. .
11、continueif?的數據行合并常用語句
通過在指定的位置指定一個或多個字符,允許組合物理記錄到邏輯記錄。
continueif next (1:2) = '--'
a1,b1,c1,
--a2,b2,c2,
a3,b3,c3,
--a4,b4,c4,
a5,b5,c5,
===》
a1,b1,c1, a2,b2,c2,
a3,b3,c3,a4,b4,c4,
a5,b5,c5,
continueif next preserve (1:2) = '--'
a1,b1,c1,
--a2,b2,c2,
a3,b3,c3,
--a4,b4,c4,
a5,b5,c5,
===》
a1,b1,c1, --a2,b2,c2,
a3,b3,c3,--a4,b4,c4,
a5,b5,c5,
continueif this preserve (1:2) = '--'
a1,b1,c1,
--a2,b2,c2,
a3,b3,c3,
--a4,b4,c4,
a5,b5,c5,
===》
a1,b1,c1,
--a2,b2,c2,a3,b3,c3,
--a4,b4,c4,a5,b5,c5,
continueif last? (= '-')
a1,b1,c1,-
a2,b2,c2,
a3,b3,c3,-
a4,b4,c4,
a5,b5,c5,
===》
a1,b1,c1, -a2,b2,c2,
a3,b3,c3,-a4,b4,c4,
a5,b5,c5,
12、sqlldr的命令語句
sqlldr [param=value[, param=value...]]
在系統提示符下啟動 SQL*加載程序并運行示例。
例如,要運行案例 1,請輸入以下命令:
sqlldr USERID=scott CONTROL=ulcase1.ctl LOG=ulcase1.log
CONTROL?將參數和參數替換為相應的控件和?LOG?日志文件名,然后按 Enter 鍵。 當系統提示輸入密碼時,?tiger?鍵入并按 Enter 鍵。
==〉> sqlldr CONTROL=ulcase1.ctl LOG=ulcase1.log
Username: scott
Password: password
userid??? 傳入您的用戶名、密碼和Net8服務名稱。?使用的語法與任何其他命令行實用程序相同,看起來像這樣:userid=username[/password][@service]?
control??? 傳入控制文件名。?下面是一個例子:: control=[path]filename[.ext] 控制文件的默認擴展名是.ctl。?
log ??????傳入日志文件名。?例如: log=[path]filename[.ext]?日志文件的默認擴展名為。log。?如果不提供文件名,日志文件將被命名為與控制文件匹配?
bad ?????傳入錯誤的文件名。?例如: bad=[path]filename[.ext]壞文件的默認擴展名是。bad。?如果您沒有提供文件名,那么壞文件將被命名為與控制文件匹配。?使用此參數將覆蓋可能在控制文件中指定的任何文件名。?
Data???? 傳入數據文件名。?例如: data=[path]filename[.ext]數據文件的默認擴展名是。dat。?在命令行上指定數據文件名將覆蓋控制文件中指定的名稱。?如果沒有在任何地方指定數據文件名,則默認使用與控制文件相同的名稱,但擴展名為.dat。?
discard ????傳入丟棄的文件名。?例如: discard=[path]filename[.ext]?用于丟棄文件的默認擴展名是。dis。?如果不提供文件名,則丟棄文件將被命名為與控制文件匹配。?使用此參數將覆蓋控制文件中可能指定的任何丟棄文件名。?
discardmax ??可選地對允許丟棄的記錄數量進行限制。?語法是這樣的:discardmax=number_of_records如果丟棄的記錄數量超過這個限制,加載將被中止。?
Skip??? 允許您跳過指定數量的邏輯記錄。?語法如下:skip=number_of_records當您想要繼續加載已經中止的文件,并且知道在重新啟動之前要進入文件的多少位置時,可以使用skip參數。?
load ???可選地限制要加載到數據庫中的邏輯記錄的數量。?語法是這樣的:load=number_of_records一旦達到指定的限制,SQL*Loader將停止。?
Errors? 指定SQL*Loader終止加載之前允許的錯誤數量。?語法看起來是這樣的:errors=number_of_records SQL*Loader將在收到超過指定數量的錯誤時停止加載。?默認限制為50。?沒有辦法允許無限數量。?最好是指定一個非常高的值,比如999999999。?
Rows?? 間接控制加載過程中提交的頻率。rows參數以行為單位指定用于常規路徑加載的綁定數組的大小。SQL*Loader會將該值舍入為I/O塊大小的若干倍。rows參數的語法如下所示:rows=number_of_rows對于常規路徑加載,默認值是64。默認情況下,只有在完成整個負載時才保存直接路徑負載。但是,當完成直接路徑負載時,可以使用此參數直接控制提交頻率
………
USERID={username[/password][@net_service_name]|/}
CONTROL=control_file_name
LOG=path_file_name
BAD=path_file_name
DATA=path_file_name
DISCARD=path_file_name
DISCARDMAX=logical_record_count
SKIP=logical_record_count
SKIP_INDEX_MAINTENANCE={TRUE | FALSE}
SKIP_UNUSABLE_INDEXES={TRUE | FALSE}
LOAD=logical_record_count
ERRORS=insert_error_count
ROWS=rows_in_bind_array
BINDSIZE=bytes_in_bind_array
SILENT=[(]keyword[,keyword...][)]
DIRECT={TRUE | FALSE}
PARFILE=path_file_name
PARALLEL={TRUE | FALSE}
READSIZE=bytes_in_read_buffer
FILE=database_datafile_name
13、編寫表達式來修改加載的數據
LOAD DATA
INFILE ‘animal_feeding_expr.csv’
BADFILE ‘animal_feeding_expr’
APPEND
INTO TABLE animal_feeding
TRAILING NULLCOLS
(
animal_id INTEGER EXTERNAL TERMINATED BY “,”,
feeding_date DATE “dd-mon-yyyy” TERMINATED BY “,”,
pounds_eaten DECIMAL EXTERNAL TERMINATED BY “,”
??? “:pounds_eaten * 2.2”,??? 取到的值*2.2
note CHAR TERMINATED BY “,”
???? OPTIONALLY ENCLOSED BY ‘“‘
??? “UPPER(:note)”? ?字符轉成大寫
)
截取
SAL position(17:20),
COMM "substr(:SAL,1,1)"
替換
REMARK "replace(:remark, '\\n',chr(10))"
空白看成NULL
animal_id POSITION (1:3) INTEGER EXTERNAL
? ? ??????NULLIF animal_id=BLANKS,
自動生成字段值
column_name {
RECNUM??? 遞增數值從1開始
?|SYSDATE?? 系統時間
?|CONSTANT {string | "string"}?? 常量值
?|SEQUENCE [({COUNT | MAX|integer}[,increment])]? 效果與RECNUM差不多,可以設置開始值
?}
eg:
REMARK??? CONSTANT "United States Geological Survey",
TIMES? ???SYSDATE
去掉空格
county POSITION(64) CHAR(5) "RTRIM(:county)"
NVL
elevation POSITION(49) INTEGER EXTERNAL(4)
"NVL(:elevation,0)",
轉數字計算
price POSITION(37:40) "TO_NUMBER(:bookPrice)/100"? -- TO_NUMBER(NVL(:price,0))/100
取最大值
price POSITION(37) "GREATEST(TO_NUMBER(:price)/100, TO_NUMBER(:pages*0.10))",
14、反斜杠轉義字符
SQL*加載程序和外部表使用各種約定將單引號標識為封閉字符。
SQL*Loader 允許使用反斜杠 (?\?) 轉義字符,以確保將單引號標識為括起來的字符。
例如
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\''
<==>
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY "'"
在 DDL 語法中,反斜杠轉義字符 (\)。
"so'\"far"???? or? 'so\'"far'???? ==〉? so'"far
"'so\\far'"??? or? '\'so\\far\'' ==〉? 'so\far'
"so\\\\far"??? or? 'so\\\\far'??? ==〉?? so\\far
15 控制文件內容
1??? -- This is an example control file
2??? LOAD DATA
3??? INFILE 'sample.dat'
4??? BADFILE 'sample.bad'
5??? DISCARDFILE 'sample.dsc'
6??? APPEND
7??? INTO TABLE emp
8??? WHEN (57) = '.'
9??? TRAILING NULLCOLS
10? (hiredate SYSDATE,
????? deptno POSITION(1:2)? INTEGER EXTERNAL(2)
????????????? NULLIF deptno=BLANKS,
?????? job??? POSITION(7:14)? CHAR? TERMINATED BY WHITESPACE
???????????? ?NULLIF job=BLANKS? "UPPER(:job)",
?????? mgr??? POSITION(28:31) INTEGER EXTERNAL
????????????? TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,
?????? ename? POSITION(34:41) CHAR
????????????? TERMINATED BY WHITESPACE? "UPPER(:ename)",
?????? empno? POSITION(45) INTEGER EXTERNAL
????????????? TERMINATED BY WHITESPACE,
?????? sal??? POSITION(51) CHAR? TERMINATED BY WHITESPACE
????????????? "TO_NUMBER(:sal,'$99,999.99')",
?????? comm?? INTEGER EXTERNAL? ENCLOSED BY '(' AND '%'
????????????? ":comm * 100"
??? )
此示例控制文件中左側的數字未出現在實際控制文件中。 這些數字對應于以下說明中的數字:
- 控制文件中條目之前的此注釋是如何在控制文件中輸入注釋的示例。 “--”表注釋
- LOAD DATA?該語句在 SQL*Loader 中啟動新的數據加載。 有關語法詳細信息,請參閱 SQL*加載程序語法圖。
- INFILE?該子句指定包含要加載的數據的數據文件的名稱。 有關更多信息,請參閱指定數據文件。
- BADFILE?該子句指定拒絕記錄寫入的文件的名稱。 有關詳細信息,請參閱指定錯誤文件。
- DISCARDFILE?該子句指定邏輯刪除記錄寫入的文件的名稱。 有關詳細信息,請參閱指定放棄文件。
- APPEND?子句是可用于將數據加載到非空表中的選項之一。 有關更多信息,請參見將數據加載到非空表中。
若要將數據加載到空表中,請使用?INSERT?子句。 有關更多信息,請參見將數據加載到空表中。
- INTO TABLE?可以使用子句來標識表、字段和數據類型。 此子句定義數據文件中的記錄與數據庫中的表之間的關系。 有關更多信息,請參見指定表名。
- WHEN?子句指定一個或多個字段條件。 SQL*加載器根據此條件確定是否加載數據。 有關詳細信息,請參閱有條件加載記錄。
- TRAILING NULLCOLS?使用子句時,如果記錄中不存在由相對位置指定的列,則該列的值將被視為 NULL。 有關詳細信息,請參閱處理缺少數據的短記錄。
- 控制文件的其余部分包含一個字段列表,您可以在其中查看正在加載的表的列格式詳細信息。 有關控制文件節的詳細信息,請參閱 SQL*加載程序字段列表參考。
16在控制文件中指定命令行參數
在 SQL*Loader 控制文件中,可以使用子句指定?OPTIONS
?命令行參數。
OPTIONS (parameter=value[,parameter=value...])
OPTIONS
?從句放在LOAD DATA
句子之前。?
eg:
OPTIONS (SILENT=ALL, ERRORS=999999)
LOAD DATA
INFILE 'mi_deci.dat'
TRUNCATE
INTO TABLE GNIS(…)
有關OPTIONS?這些參數的說明,請參閱 SQL*加載程序命令行參考。BINDSIZE = n
COLUMNARRAYROWS = n
DATE_CACHE = n
DEGREE_OF_PARALLELISM= {degree-num|DEFAULT|AUTO|NONE}
DIRECT = {TRUE | FALSE}
EMPTY_LOBS_ARE_NULL = {TRUE | FALSE}
ERRORS = n
EXTERNAL_TABLE = {NOT_USED | GENERATE_ONLY | EXECUTE}
FILE = tablespace file
LOAD = n
MULTITHREADING = {TRUE | FALSE}
PARALLEL = {TRUE | FALSE}
READSIZE = n
RESUMABLE = {TRUE | FALSE}
RESUMABLE_NAME = 'text string'
RESUMABLE_TIMEOUT = n
ROWS = n
SDF_PREFIX = string
SILENT = {HEADER | FEEDBACK | ERRORS | DISCARDS | PARTITIONS | ALL}
SKIP = n??
SKIP_INDEX_MAINTENANCE = {TRUE | FALSE}
SKIP_UNUSABLE_INDEXES = {TRUE | FALSE}
STREAMSIZE = n
TRIM= {LRTRIM|NOTRIM|LTRIM|RTRIM|LDRTRIM}
17WHEN條件
LOAD DATAINFILE 'michigan_feature_names.dat'BADFILE 'michigan.bad'APPEND INTO TABLE featuresWHEN (feature_type='falls') AND (county='Alger')(state????????? CHAR TERMINATED BY ',' ENCLOSED BY '"',feature_name CHAR TERMINATED BY ',' ENCLOSED BY '"',feature_type CHAR TERMINATED BY ',' ENCLOSED BY '"',county ???????CHAR TERMINATED BY ',' ENCLOSED BY '"')
18自定義方法調用
CREATE OR REPLACE FUNCTION price_check(price_in NUMBER, pages_in NUMBER)
RETURN NUMBER ISmin_price NUMBER;
BEGINSELECT ppt_min_price INTO min_priceFROM price_page_thresholdWHERE pages_in >= ppt_pagesAND ppt_pages = (SELECT MAX(ppt_pages)FROM price_page_thresholdWHERE pages_in >= ppt_pages);RETURN GREATEST(min_price,price_in);
END;LOAD DATAINFILE 'book_prices.dat'REPLACE INTO TABLE book(book_title POSITION(1) CHAR(35),book_price POSITION(37)"price_check(:book_price,:book_pages)",book_pages POSITION(42) INTEGER EXTERNAL(3),book_id "book_seq.nextval")