您好,登錄后才能下訂單哦!
SQL*Loader對不同文件及格式的處理方法
通常對于邏輯比較復雜的系統可能存在這種情況,因為導出的數據來源于多個系統, 因此可能提供給DBA的也是多個數據文件。這種情況并不一定需要執行多次加載,只需要在控制文件中做適當配置即可。不過有一點非常重要,提供的數據文件中的數據存放格式必須完全相同。
創建演示表tb_manager表
--創建tb_manager表
SCOTT@seiang11g>create table tb_manager(mgrno number,mname varchar2(30),job
varchar2(300),remark varchar2(4000));
Table created.
有多個數據文件,分別如下:
--數據文件1
[oracle@wjq SQL*Loader]$ vim wjq_test8_1.dat
10,SMITH,SALES MANAGER
11,ALLEN.W,TECH MANAGER
16,BLAKE,HR MANAGER
18,WJQ,TEACHER MASTER
--數據文件2
[oracle@wjq SQL*Loader]$ vim wjq_test8_2.dat
12,WARD,SERVICE MANAGER
13,TURNER,SELLS DIRECTOR
15,JAMES,HR DIRECTOR
--數據文件3
[oracle@wjq SQL*Loader]$ vim wjq_test8_3.dat
17,MILLER,PRESIDENT
創建控制文件,制定多個INFILE參數即可,控制文件如下:
--控制文件
[oracle@wjq SQL*Loader]$ vim wjq_test8.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test8_1.dat'
INFILE '/u01/app/oracle/SQL*Loader/wjq_test8_2.dat'
INFILE '/u01/app/oracle/SQL*Loader/wjq_test8_3.dat'
TRUNCATE INTO TABLE tb_manager
FIELDS TERMINATED BY ","
(
MGRNO,MNAME,JOB
)
執行sqlldr命令,并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test8.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 15:45:43 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 4
Commit point reached - logical record count 7
Commit point reached - logical record count 8
--查看結果
SCOTT@seiang11g>select * from tb_manager;
MGRNO MNAME JOB REMARK
---------- -------------------- ------------------------------
------------------------------
10 SMITH SALES MANAGER
11 ALLEN.W TECH MANAGER
16 BLAKE HR MANAGER
18 WJQ TEACHER MASTER
12 WARD SERVICE MANAGER
13 TURNER SELLS DIRECTOR
15 JAMES HR DIRECTOR
17 MILLER PRESIDENT
控制文件提供了多種邏輯判斷方式,只要能把邏輯清晰地描述出來,SQL*Loader就能 按照指定的邏輯執行加載。
數據文件如下:
--數據文件
[oracle@wjq SQL*Loader]$ cat wjq_test9.dat
BON SMITH CLEAK 3904
BON ALLEN SALER,M 2891
BON WARD
SALER,"S" 3128
BON KING
PRESIDENT 2523
MGR 10 SMITH SALES MANAGER
MGR 11 ALLEN.W TECH MANAGER
MGR 16 BLAKE HR MANAGER
TMP SMITH 7369 CLERK 1020 20
TMP ALLEN 7499 SALESMAN 1930 30
TMP WARD
7521 SALESMAN 1580 30
TMP JONES 7566 MANAGER 3195 20
需求是將MGR開頭的記錄導入到tb_manager表,以BON開頭的記錄導入到tb_loader表,其他記錄存放到廢棄文件中,創建控制文件如下:
--控制文件
[oracle@wjq SQL*Loader]$ cat wjq_test9.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test9.dat'
DISCARDFILE '/u01/app/oracle/SQL*Loader/wjq_test9.dsc'
TRUNCATE
INTO TABLE tb_loader
WHEN TAB='BON'
(
TAB FILLER POSITION(1:3),
ENAME POSITION(6:10),
JOB POSITION(*+1:20),
SAL POSITION(*+3:27)
)
INTO TABLE tb_manager
WHEN TAB='MGR'
(
TAB FILLER POSITION(1:3),
MGRNO POSITION(6:7),
MNAME POSITION(9:15),
JOB POSITION(*+2:30)
)
雖然這個控制文件看起來比之前的都要復雜,但只有一個新語法,即關鍵字,我們這里通過WHEN來實現判斷,很容易理解。同時,指定了DISCARDFILE參數,以生成不滿足加載條件的廢棄文件,如果你有心,不妨等執行完sqlldr命令后査看wjq_test9.dsc文件和wjq_test9.log文件。
另外注意,控制文件中WHEN邏輯判斷不支持OR關鍵字,因此如果你的判斷條件有多個,則只能通過AND連接,而不能直接使用OR。
執行sqlldr命令,并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test9.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 15:55:48 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 11
--查看結果
SCOTT@seiang11g>select * from tb_loader;
ENAME JOB SAL COMM
---------- ------------------------------ ---------- ----------
SMITH CLEAK 3904
ALLEN SALER,M 2891
WARD SALER,"S" 3128
KING PRESIDENT 2523
SCOTT@seiang11g>select * from tb_manager;
MGRNO MNAME JOB REMARK
---------- -------------------- ------------------------------
------------------------------
10 SMITH SALES MANAGER
11 ALLEN.W TECH MANAGER
16 BLAKE HR MANAGER
這里貼一下log日志和廢棄日志
--log日志
[oracle@wjq SQL*Loader]$ cat wjq_test9.log
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 15:55:48 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Control File:
/u01/app/oracle/SQL*Loader/wjq_test9.ctl
Data File:
/u01/app/oracle/SQL*Loader/wjq_test9.dat
Bad File: /u01/app/oracle/SQL*Loader/wjq_test9.bad
Discard File:
/u01/app/oracle/SQL*Loader/wjq_test9.dsc
(Allow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array: 64 rows, maximum of
256000 bytes
Continuation: none specified
Path used: Conventional
Table TB_LOADER, loaded when TAB = 0X424f4e(character 'BON')
Insert option in effect for this table: TRUNCATE
Column Name Position Len
Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
TAB
1:3 3 CHARACTER
(FILLER FIELD)
ENAME
6:10 5 CHARACTER
JOB
NEXT+1:20 19 CHARACTER
SAL
NEXT+3:27 24 CHARACTER
Table TB_MANAGER, loaded when TAB = 0X4d4752(character 'MGR')
Insert option in effect for this table: TRUNCATE
Column Name Position Len
Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
TAB
1:3 3 CHARACTER
(FILLER FIELD)
MGRNO
6:7 2 CHARACTER
MNAME
9:15 7 CHARACTER
JOB
NEXT+2:30 28 CHARACTER
Record 8: Discarded - failed all WHEN clauses.
Record 9: Discarded - failed all WHEN clauses.
Record 10: Discarded - failed all WHEN clauses.
Record 11: Discarded - failed all WHEN clauses.
Table TB_LOADER:
4 Rows successfully loaded.
0 Rows not loaded due to data errors.
7 Rows not loaded because all WHEN
clauses were failed.
0 Rows not loaded because all fields
were null.
Table TB_MANAGER:
3 Rows successfully loaded.
0 Rows not loaded due to data errors.
8 Rows not loaded because all WHEN
clauses were failed.
0 Rows not loaded because all fields
were null.
Space allocated for bind array: 7168 bytes(64 rows)
Read buffer bytes: 1048576
Total logical records skipped: 0
Total logical records read: 11
Total logical records rejected: 0
Total logical records discarded: 4
Run began on Tue Oct 31 15:55:48 2017
Run ended on Tue Oct 31 15:55:48 2017
Elapsed time was: 00:00:00.08
CPU time was: 00:00:00.02
--廢棄日志
[oracle@wjq SQL*Loader]$ cat wjq_test9.dsc
TMP SMITH 7369 CLERK 1020 20
TMP ALLEN 7499 SALESMAN 1930 30
TMP WARD
7521 SALESMAN 1580 30
TMP JONES 7566 MANAGER 3195 20
假如某天你接到一項數據加載需求,用戶提供了一份100萬行的數據文件,告訴你只導后50萬行,恭喜,你接到了一個正常的需求!
實現的方式較多,比如修改數據文件,只保留后50萬行(Windows下借助EditPlus 這類文本工具可以輕松實現,Linux/UNIX下通過TAIL等命令也可以輕易實現),如果你人很懶,不想修改文件,那正合sqlldr胃口,人家早早地就提供好了SKIP參數專用于滿足此類需求。
數據文件如下:
--數據文件
[oracle@wjq SQL*Loader]$ vim wjq_test10.dat
#This is data of emp
ENAME MGR JOB SAL
---------- ----- --------- ---------
SMITH 7902 CLERK 1020
LEN 7698 SALESMAN 1930
▽ARD
7698 SALESMAN 1580
JONES 7839 MANAGER 3195
MARTIN 7698 SALESMAN 1580
BLAKE 7839 MANAGER 3180
CLARK 7839 MANAGER 2172
SCOTT 7566 ANALYST 3220
KING PRESIDENT 4722
TURNER 7698 SALESMAN 1830
ADAMS 7788 CLERK 1320
JAMES 7698 CLERK 1280
FORD 7566 ANALYST 3220
MILLER 7782 CLERK 1022
我們只對該數據文件只從第4行開始導入,即前3行不進行導入,創建控制文件如下:
--控制文件
[oracle@wjq SQL*Loader]$ vim wjq_test10.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test10.dat'
TRUNCATE INTO TABLE tb_loader
(
ENAME position(1:6),
XCOL FILLER position(13:16),
JOB position(18:26),
SAL position(32:35)
)
執行sqlldr命令,并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test10.ctl skip=3
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 16:12:11 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 14
--查看結果
SCOTT@seiang11g>select * from tb_loader;
ENAME JOB SAL COMM
---------- ------------------------------ ---------- ----------
SMITH CLERK 1020
ALLEN SALESMAN 1930
WARD SALESMAN 1580
JONES MANAGER 3195
MARTIN SALESMAN 1580
BLAKE MANAGER 3180
CLARK MANAGER 2172
SCOTT ANALYST 3220
KING PRESIDENT 4722
TURNER SALESMAN 1830
ADAMS CLERK 1320
JAMES CLERK 1280
FORD ANALYST 3220
MILLER CLERK 1022
如果用戶要求較高,明確指定只加載第XX到第XX行的記錄,sqlldr還有一個參數叫LOAD,配置LOAD參數即可輕松實現。
這里仍使用上述數據文件,需求改為只導入第4到9行的記錄,我們連控制文件都不需要修改,只需要在執行sqlldr時再加上LOAD參數即可:
執行sqlldr命令(即skip=3跳過前3行,load=6,加載接下來的6行記錄),并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test10.ctl skip=3 load=6
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 16:15:13 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 6
--查看結果
SCOTT@seiang11g>select * from tb_loader;
ENAME JOB SAL
COMM
---------- ------------------------------ ---------- ----------
SMITH CLERK 1020
ALLEN SALESMAN 1930
WARD SALESMAN 1580
JONES MANAGER 3195
MARTIN SALESMAN 1580
BLAKE MANAGER 3180
由于標準換行符也是sqlldr識別數據行結束的標志符,因此要將含換行符的數據加載到表中稍復雜一點點,而且需要根據實際情況來處理,不同情況的處理方式也不一樣,
但基本思路是相同的,就是要同sqlldr指明什么時候才需要進行換行操作。
在手工指定換行符的情況下,數據文件中的換行符并不是標準的換行標志,而是用戶自定義的一個標識字符(或多個字符組成),這種情況的處理比較簡單,如數據文件如下:
--數據文件
[oracle@wjq SQL*Loader]$ vim wjq_test11_1.dat
10,SMITH,SALES MANAGER,This is SMITH.\nHe is a Sales Manager.
11,ALLEN.W,TECH MANAGER,This is ALLEN.W.\nHe is a Tech Manager.
16,BLAKE,HR MANAGER,This is BLAKE.\nHe is a Hr Manager.
我們可以通過控制文件,在數據加載前處理remark列的數據,將用戶指定的字符替換為chr(10),即標準換行符,創建控制文件如下:
--控制文件
[oracle@wjq SQL*Loader]$ vim wjq_test11_1.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test11_1.dat'
TRUNCATE INTO TABLE tb_manager
FIELDS TERMINATED BY ","
(
MGRNO,
MNAME,
JOB,
REMARK
"REPLACE(:remark,'\\n',chr(10))"
)
這里需要注意的是,替換時必須指定"\\n"而不只是"\n",因為"\n"會被SQLLDR 識別成換行符并轉換成換行標志,這樣可能導致數據加載出錯。而是默認轉義符,指定該轉義符后sqlldr就會將"\n"識別成普通字符了。
執行sqlldr命令,并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test11_1.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 16:21:04 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 3
--查看結果
SCOTT@seiang11g>select * from tb_manager;
MGRNO MNAME JOB REMARK
---------- -------------------- ------------------------------
------------------------------
10 SMITH SALES MANAGER This is SMITH.
He is a Sales Manager.
11 ALLEN.W TECH MANAGER This is ALLEN.W.
He is a Tech Manager.
16 BLAKE HR MANAGER This is BLAKE.
He is a Hr Manager.
數據文件如下:
--數據文件
[oracle@wjq SQL*Loader]$ cat wjq_test11_2.dat
10 SMITH SALES MANAGER THIS IS
SMITH.
HE IS A SALES MANAGER.
11 ALLEN.W TECH MANAGER THIS IS ALLEN.W
HE IS A TECH MANAGER.
16 BLAKE HR MANAGER THIS IS BLAKE.
HE IS A HR MANAGE.
(特別注意:因為使用的FIX固定長度,所以一定要注意每一行數據的長度,不夠的使用空格來代替,否則在加載的使用會報錯,報錯信息如下所示:
SQL*Loader-501: Unable to read file (wjq_test11_2.dat)
SQL*Loader-566: partial record found at end of datafile
SQL*Loader-2026: the load was aborted because SQL Loader cannot continue.
報錯的原因并不是說讀不到要加載的數據文件,相反,雖然出現了報錯的信息,也有可能部分數據已經導入進去了,報錯因為你的存在數據并不是你所FIX的長度,所以出現報錯,故在使用FIX的時候一定要注意這一點)
創建控制文件如下:
--控制文件
[oracle@wjq SQL*Loader]$ vim wjq_test11_2.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test11_2.dat' "FIX 65"
TRUNCATE INTO TABLE tb_manager
(
MGRNO POSITION(1:2),
MNAME POSITION(*+1:10),
JOB POSITION(*+1:24),
REMARK POSITION(*+1:63)
)
FIX是INFILE關鍵字的一個屬性,INFILE不僅有FIX屬性,還有VAR和STR等屬性
執行sqlldr命令,并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test11_2.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Wed Nov 1 10:37:45 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 3
--查看結果
SCOTT@seiang11g>select * from tb_manager;
MGRNO MNAME JOB REMARK
---------- -------------------- ------------------------------
----------------------------------------
10 SMITH SALES MANAGER THIS IS SMITH.
HE IS A SALES MANAGER.
11 ALLEN.W TECH
MANAGER THIS IS
ALLEN.W.
HE IS A TECH MANAGER.
16 BLAKE HR MANAGER THIS IS BLAKE.
HE
IS A HR MANAGER.
這種方式其實就是在加載數據文件之前,先通過FIX屬性指定每行的長度(這里每行65個字符,包括換行符在內,該例子上不夠字符的用空格來代替了,注意上面數據文件中的結尾的空格),到了指定長度就換行,不管中間有沒有換行符,因此僅能用于定長字符串的數據文件,因為只有字符串定長,你才知道應該在INFILE處指定什么值。
針對上述的數據文件也可以通過使用CONCATENATE屬性處理換行符來處理換行符,控制文件內容如下所示:
[oracle@wjq SQL*Loader]$ vim wjq_test11_2.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test11_2.dat'
CONCATENATE 2 INTO TABLE tb_manager
(
MGRNO POSITION(1:2),
MNAME POSITION(*+1:10),
JOB POSITION(*+1:24),
REMARK POSITION(*+1:63)
"REPLACE(upper(:REMARK),'HE',chr(10)||'HE')"
)
前面提到INFILE關鍵字還支持VAR屬性,語法格式為INFILE filename "var
n", n的值不能超過40,否則會報錯,如果不指定n則默認值為5。
本小節就演示通過這種方式處理換行符。總的來說,這確實是相當有才的一種方式, 首先通過VAR屬性在每行開頭指定一個固定長度的字符串,該字符串指明該行的長度,通過這種方式支持變長字符串。
數據文件如下:
--數據文件
[oracle@wjq SQL*Loader]$ vim wjq_test11_3.dat
06110,SMITH,SALES MANAGER,This is SMITH.
He is a Sales Manager.
06311,ALLEN.W,TECH MANAGER,This is ALLEN.W.
He is a Tech Manager.
05516,BLAKE,HR MANAGER,This is BLAKE.
He is a Hr Manager.
數據文件中每行開頭的061,063,055分別表示該行取61,63,55個字符
創建控制文件如下:
--控制文件
[oracle@wjq SQL*Loader]$ vim wjq_test11_3.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test11_3.dat' "var 3"
TRUNCATE INTO TABLE tb_manager
FIELDS TERMINATED BY ","
(MGRNO,MNAME,JOB,REMARK)
執行sqlldr命令,并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test11_3.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Wed Nov 1 09:51:12 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 3
--查看結果
SCOTT@seiang11g>select * from tb_manager;
MGRNO MNAME JOB REMARK
---------- -------------------- ------------------------------
----------------------------------------
10 SMITH SALES MANAGER This is SMITH.
He
is a Sales Manager.
11 ALLEN.W TECH MANAGER This is ALLEN.W.
He is a Tech Manager.
16 BLAKE HR MANAGER This is BLAKE.
He is a Hr Manager.
①這種方式可以視為第2種方式的變種,該方法不在INFILE處指定行長度,而改為在每行的行首位置標注該行長度,以支持變長類型的數據格式。
②綜合來看,這兩種方式實用價值都比較低,先不說用戶是否真有如此耐心來生成這樣格式的數據文件,就算用戶按照這種格式提供,要知道windows、Linux/UNIX下因操作系統自身原因,對換行符識別也不同,在Windows環境下換行標志由"回車chr(13)+換行chr(10)" 兩個字節組成,而Linux/UNIX環境則是"換行chr(10)"一個字節,也就是說指定了長度,操作系統變了以后,長度有可能也得跟著變,這就造成用戶提供的數據文件通用性較差。
③有沒有一種更簡單的方式呢?事實上確實沒有太簡單的方式,在前面的內容中就提到, 你需要為sqlldr指明什么時候應該換行,因此對數據文件進行預處理是必然的,不過相對來講,下面將要介紹的方式更易于操作,也更可行一些。
這種方式也需要先對數據文件做處理,在記錄換行處打上一個標記,比如"丨"(當然可以定義為其他字符,但注意不要與要導入的數據有沖突),這樣sqlldr見到該字符就知道換行的時候到了。
由于單個字符出現在導入數據中的機率較高,因此建議換行標志盡可能由多個字符組成,通常習慣于定義“字符+換行符”作為新的換行標記,這里我們也采用這種方式。
數據文件和控制文件如下:
--數據文件
[oracle@wjq SQL*Loader]$ vim wjq_test11_4.dat
10,SMITH,SALES MANAGER,This is SMITH.
He is a Sales Manager.|
11,ALLEN.W,TECH MANAGER,This is ALLEN.W.
He is a Tech Manager.|
16,BLAKE,HR MANAGER,This is BLAKE.
He is a Hr Manager.|
--控制文件
[oracle@wjq SQL*Loader]$ vim wjq_test11_4.ctl
LOAD DATA
INFILE '/u01/app/oracle/SQL*Loader/wjq_test11_4.dat' "str '|\n'"
TRUNCATE INTO TABLE tb_manager
FIELDS TERMINATED BY ","
(MGRNO,MNAME,JOB,REMARK)
執行sqlldr命令,并查看結果
--執行sqlldr命令
[oracle@wjq SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test11_4.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Wed Nov 1 09:45:28 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 3
--查看結果
SCOTT@seiang11g>select * from tb_manager;
MGRNO MNAME JOB REMARK
---------- -------------------- ------------------------------ ----------------------------------------
10 SMITH SALES MANAGER This is SMITH.
He is a Sales Manager.
11 ALLEN.W TECH MANAGER This is ALLEN.W.
He is a Tech Manager.
16 BLAKE HR MANAGER This is BLAKE.
He is a Hr Manager.
STR屬性中支持兩種字符指定方式:
'char_string':普通字符,即標準的可見字符,不過也有些不可見字符可以通過下列反斜杠標識的方式在字符串模式中指定:
\n:表示換行。
\t:表示行制表符(tab)。
\f:表示換頁。
\v:表示列制表符。
\r:表示回車。
說到這里,又不得不再次提及Windows和Linux/UNIX對換行符識別的差異,Linux/UNIX下指定"\n"即可,Windows下需要指定"\r\n"才表示一個完整的換行符。
X'hex_string':二進制字符。對于一些不可見字符,如像回車換行這類字符,可以將其轉換成十六進制,然后再通過str X'hex_str'方式指定。
比如上述控制文件中的功能如果用二進制字符表示,形式如下:
INFILE ldr_case11_4.dat "str X'7C0A'"
要査看指定字符的十六進制編碼,可以通過UTL_RAW.CAST_TO_RAW生成,例如:
SCOTT@seiang11g>select utl_raw.cast_to_raw('|'||chr(10)) from dual;
UTL_RAW.CAST_TO_RAW('|'||CHR(10))
--------------------------------------------------------------------------------
7C0A
這種方式相當于自定義一個換行標志,標準換行符不再擁有特殊的意義,只是作為要加載數據的一部分。較第一種方式而言最大的優勢是,數據文件相對更容易處理,只需要在生成數據文件時,最后一列附加一個指定字符即可,對于稍有SQL基礎的人來說,這都是小case。
作者:SEian.G(苦練七十二變,笑對八十一難)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。