下面的是關於sql*loader 的使用的一點總結 有些是來自itpub上的一些網友的總結
大部分是oracle專家高級編程上的實例 只是我實踐以後寫的結果
sqlldr userid=lgone/tiger control=a
LOAD DATA
INFILE
// INFILE
// INFILE * // 要導入的內容就在control文件裡 下面的BEGINDATA後面就是導入的內容
INTO TABLE table_name // 指定裝入的表
// into table t_name partition (p_
BADFILE
************* 以下是
APPEND // 原先的表有數據 就加在後面
// INSERT // 裝載空表 如果原先的表有數據 sqlloader會停止 默認值
// REPLACE // 原先的表有數據 原先的數據會全部刪除
// TRUNCATE // 指定的內容和replace的相同 會用truncate語句刪除現存數據
SKIP
************* 指定的TERMINATED可以在表的開頭 也可在表的內部字段部分
FIELDS TERMINATED BY
// 裝載這種數據:
// 在表中結果:
// TERMINATED BY X
// TERMINATED BY WRITESPACE // 裝載這種數據:
TRAILING NULLCOLS ************* 表的字段沒有對應的值時允許為空
************* 下面是表的字段
(
col_
// 如: lg
)
// 當沒聲明FIELDS TERMINATED BY
// (
// col_
// col_
// col_
// )
// 當沒聲明FIELDS TERMINATED BY
// (
// col_
// col_
// col_
// col_
// col_
// )
BEGINDATA // 對應開始的 INFILE * 要導入的內容就在control文件裡
=====================================================================================
//////////// 注意begindata後的數值前面不能有空格
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
(DEPTNO
DNAME
LOC
)
BEGINDATA
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY WHITESPACE
(DEPTNO
DNAME
LOC
)
BEGINDATA
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
( DEPTNO
FILLER_
DNAME
LOC
)
BEGINDATA
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
( DEPTNO position(
DNAME position(*:
LOC position(*:
ENTIRE_LINE position(
)
BEGINDATA
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS // 其實下面的ENTIRE_LINE在BEGINDATA後面的數據中是沒有直接對應
// 的列的值的 如果第一行改為
(DEPTNO
DNAME
LOC
LAST_UPDATED date
ENTIRE_LINE
)
BEGINDATA
使用函數這僅適合於常規導入
create or replace
function my_to_date( p_string in varchar
as
type fmtArray is table of varchar
l_fmts fmtArray := fmtArray(
l_return date;
begin
for i in
loop
begin
l_return := to_date( p_string
exception
when others then null;
end;
EXIT when l_return is not null;
end loop;
if ( l_return is null )
then
l_return :=
new_time( to_date(
p_string
end if;
return l_return;
end;
/
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS
(DEPTNO
DNAME
LOC
LAST_UPDATED
)
BEGINDATA
LOAD DATA
INFILE *
concatenate
INTO TABLE DEPT
replace
FIELDS TERMINATED BY
(DEPTNO
DNAME
LOC
LAST_UPDATED date
)
BEGINDATA
Virginia
// 這列子用 continueif list=
告訴sqlldr在每行的末尾找逗號 找到逗號就把下一行附加到上一行
LOAD DATA
INFILE *
continueif this(
// 如
//
// 其中
INTO TABLE DEPT
replace
FIELDS TERMINATED BY
(DEPTNO
DNAME
LOC
LAST_UPDATED date
)
BEGINDATA // 但是好象不能象右面的那樣使用
Finance
================================ 用別的語言幫助解決的方法
txt文件中的每
插入數據記錄是
可以把換行符作為一個分隔符來處理
a b c d e
f g
$mycount=
open(FILE_OLD
open(FILE_NEW
while(<FILE_OLD>)
{
chomp;
if ($mycount%
{print FILE_NEW $_
else
{print FILE_NEW $_
$mycount++;
}
a b c d e f g
load data
infile
concatenate(
into table aa
fields terminated by whitespace
(FIELD
==============================================================
load data
infile *
into table t
replace
( seqno RECNUM //載入每行的行號
text Position(
BEGINDATA
fsdfasj //自動分配一行號給載入 表t 的seqno字段 此行為
fasdjfasdfl // 此行為
注意: unix 和 windows 不同 \\n & /n
還可以用 dbms_lob 和 bfile 看一個文件的回車 換行 等其他特殊字符
<
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS
(DEPTNO
DNAME
LOC
LAST_UPDATED
COMMENTS
)
BEGINDATA
<
LOAD DATA
INFILE demo
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS
(DEPTNO
DNAME
LOC
LAST_UPDATED
COMMENTS
)
demo
Office in Virginia
Office in Virginia
Office in Virginia
Office in Virginia
// 這樣裝載會把換行符裝入數據庫 下面的方法就不會 但要求數據的格式不同
LOAD DATA
INFILE demo
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS
(DEPTNO
DNAME
LOC
LAST_UPDATED
COMMENTS
)
demo
Office in Virginia
Office in Virginia
Office in Virginia
Office in Virginia
<
LOAD DATA
INFILE demo
//
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS
(DEPTNO
DNAME
LOC
LAST_UPDATED
COMMENTS
)
demo
Office in Virginia
Office in Virginia
Office in Virginia
Office in Virginia
<
// 最靈活的一中 可定義一個新的行結尾符 win 回車換行 : chr(
此列中記錄是以 a|\r\n 結束的
select utl_raw
結果
LOAD DATA
INFILE demo
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS
(DEPTNO
DNAME
LOC
LAST_UPDATED
COMMENTS
)
demo
Office in Virginia|
Office in Virginia|
Office in Virginia|
Office in Virginia|
LOAD DATA
INFILE *
REPLACE
INTO TABLE emp WHEN empno !=
(
empno POSITION(
ename POSITION(
deptno POSITION(
mgr POSITION(
)
INTO TABLE proj WHEN projno !=
(
projno POSITION(
empno POSITION(
)
options(bindsize=
load data
infile my
concatenate
preserve blanks
into table foo
append
(id constant
用 dbms_lob dbms的數據要在服務器上 通過網絡的不行
drop table demo;
create or replace directory dir
create or replace directory
create table demo
( id int primary key
theClob clob
)
/
host echo
declare
l_clob clob;
l_bfile bfile;
begin
insert into demo values (
returning theclob into l_clob;
l_bfile := bfilename(
dbms_lob
dbms_lob
dbms_lob
dbms_lob
end;
/
select dbms_lob
/
用 sqlldr 在同一行的LOB lob數據在同一個數據文件中
LOAD DATA
INFILE demo
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY
TRAILING NULLCOLS
(DEPTNO
DNAME
LOC
LAST_UPDATED
COMMENTS char(
)
Office in Virginia|
Office in Virginia|
Office in Virginia|
Office in Virginia
much longer then the other comments field
feel the need to add double quoted text in here like
this:
preserve them in the string
the | followed by a end of line
用 sqlldr 不在同一行的LOB 就是lob數據在單獨的文件中
create table lob_demo
( owner varchar
timestamp date
filename varchar
text clob
)
/
LOAD DATA /////////// window 的
INFILE *
REPLACE
INTO TABLE LOB_DEMO
( owner position(
timestamp position(
filename position(
text LOBFILE(filename) TERMINATED BY EOF
)
BEGINDATA
// 這是 windows 下面的情況 上面的數據是用 dir /q/n 看見的情況 *******
///// unix 下的情況
用 ls
控制文件就改下時間的格式
lob 到對象列
create table image_load( id number
image ordsys
/
desc ordsys
desc ordsys
LOAD DATA
INFILE *
INTO TABLE T
replace
fields terminated by
(
id
name
fiel_name filler
image column object
(
source column object
(
localdatalobfile(file_name) terminated by bof
nullif file_name=
)
)
)
begindata
create type myArrayType
as varray(
/
create table t
( x int primary key
/
LOAD DATA
INFILE *
INTO TABLE T
replace
fields terminated by
(
x
y_cnt FILLER
y varray count (y_cnt)
(
y
)
)
BEGINDATA
create or replace type myTableType
as table of number(
/
create table t
( x int primary key
nested table y store as y_tab
/
LOAD DATA
INFILE *
INTO TABLE T
replace
fields terminated by
(
x
y nested table count (CONSTANT
(
y
)
)
BEGINDATA
==============================================================================
象這樣的數據 用 nullif 子句
id position(
// 下面是另一個列子 第一行的
LOAD DATA
INFILE *
INTO TABLE T
REPLACE
(n position(
v position(
)
BEGINDATA
如果是英文的日志 格式
From:http://tw.wingwit.com/Article/program/Oracle/201311/17716.html