sqlldrsystem/dhj123@danghjcontrol=input.ctllog=dhjSQL*Loader:Release10.2.0.1.0-Productionon星期一6月111:38:102009Copyright(c)1982,2005,Oracle.Allrightsreserved.SQL*Loader-292:加載XML,LOB或VARRAY列時忽略ROWS參數SQL*Loader-951:調用一次/加載初始化錯誤" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

direct=true 錯誤處理方法 (關于 Oracle 的數

系統 2145 0
1,
E:\>sqlldr system/dhj123@danghj control=input.ctl log=dhj

SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 6月 1 11:38:10 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL*Loader-292: 加載 XML, LOB 或 VARRAY 列時忽略 ROWS 參數
SQL*Loader-951: 調用一次/加載初始化錯誤
ORA-00942: 表或視圖不存在
上面的錯誤 如果將direct=true 取消,就不存在了。


導致上面錯誤的原因是 client版本不一致。我就是數據庫是9i,client是10g,于是產生錯誤
2,
含序列,不能設direct=true。
3,
direct=true 錯誤處理方法 :

E:\>sqlldr system/dhj123@danghj control=input.ctl log=dhj

SQL*Loader: Release 9.2.0.1.0 - Production on 星期一 6月 1 13:39:17 2009

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

SQL*Loader-926: OCI 錯誤出現在uldlfca:OCIDirPathDataSave 1用于表 ACTION_C
ORA-26090: 行處于不完整狀態
SQL*Loader-2026: 由于無法繼續, 加載已中止。

這種錯誤是 數據格式的問題,處在clob上。如果沒有其他的錯誤 則在于參數rows上,它是一次性讀入的數據。在這個例子中,rows 設置為50萬,如果數據行數大于50萬則會報錯,需要調整rows的大小。rows不指定也可以的。切記啊。

OPTIONS(direct=true,ERRORS=50,skip=0,ROWS=500000, readsize=20971520, bindsize=20971520)
Load data
infile?? 'test.txt' "str'****@@@@'"
truncate
into?? table?? action_c??
fields terminated by '@#$'  optionally enclosed by '%%%%%'
(ACTION_ID,
Time DATE 'YYYY-MM-DD HH24:MI:SS',
TBSN,
CSN,
SYSTEM,
BLOCK,
UPID,
AGENT,
OFFICE,
UGR,
TXNID,
PID,
STEP DATE 'YYYY-MM-DD HH24:MI:SS',
IDNBR,
HOST,
FUNC,
ULVL,
CUST,
Input,
LINENUM,
ISCLOB,
THECLOB CHAR(50000000)
)

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

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

1. A 表的記錄導出為一條條分號隔開的 insert 語句,然后執行插入到 B 表中
2. 建立數據庫間的 dblink,然后用 create table B as select * from where ...,或 insert into B select * from 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 .....;??
alter table B nologging; insert /* +APPEND */ into B(c1,c2) values(x,xx); 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. )??
create table users( user_id number, --用戶 ID user_name varchar2(50), --用戶名 login_times number, --登陸次數 last_login date --最后登錄日期 )
  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'));??
insert into users values(1,'Unmi',3,sysdate); insert into users values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD')); insert into users values(3,'隔葉黃鶯',8,to_date('2009-01-02','YYYY-MM-DD')); insert into users values(4,'Kypfos',NULL,NULL); 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"??
" ","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN" "1","1","Unmi","3","2009-1-5 20:34:44" "2","2","","5","2008-10-15" "3","3","隔葉黃鶯","8","2009-1-2" "4","4","Kypfos","","" "5","5","不知秋","1","2008-12-23"
2) 建立一個控制文件 users.ctl,內容如下:

  1. OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的選項可以寫到這里邊來,skip=1 用來跳過數據中的第一行??
  2. LOAD DATA??
  3. INFILE "users_data.csv" --指定外部數據文件,可以寫多個 INFILE "another_data_file.csv" 指定多個數據文件??
  4. --這里還可以使用 BADFILE、DISCARDFILE 來指定壞數據和丟棄數據的文件,??
  5. truncate --操作類型,用 truncate table 來清除表中原有記錄??
  6. INTO TABLE users -- 要插入記錄的表??
  7. Fields terminated by "," -- 數據中每行記錄用 "," 分隔??
  8. Optionally enclosed by '"' -- 數據中每個字段用 '"' 框起,比如字段中有 "," 分隔符時??
  9. 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. )??
OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的選項可以寫到這里邊來,skip=1 用來跳過數據中的第一行 LOAD DATA INFILE "users_data.csv" --指定外部數據文件,可以寫多個 INFILE "another_data_file.csv" 指定多個數據文件 --這里還可以使用 BADFILE、DISCARDFILE 來指定壞數據和丟棄數據的文件, truncate --操作類型,用 truncate table 來清除表中原有記錄 INTO TABLE users -- 要插入記錄的表 Fields terminated by "," -- 數據中每行記錄用 "," 分隔 Optionally enclosed by '"' -- 數據中每個字段用 '"' 框起,比如字段中有 "," 分隔符時 trailing nullcols --表的字段沒有對應的值時允許為空 ( virtual_column FILLER, --這是一個虛擬字段,用來跳過由 PL/SQL Developer 生成的第一列序號 user_id number, --字段可以指定類型,否則認為是 CHARACTER 類型, log 文件中有顯示 user_name, login_times, last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相當用 to_date() 函數轉換 )
說明:在操作類型 truncate 位置可用以下中的一值:

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

3) 執行命令:

sqlldr 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 文件內容是:

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

sqlldr control=users.ctl

比如,在控制臺會顯示這樣的信息:

C:\>sqlldr 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 就算不錯了,開始可用結構 相同的文件,但只有少量數據,成功后開始加載大量數據,這樣可以避免時間的浪費。


參考:1. Oracle SQL*Loader -- 英文,Sql Loader 的官方使用說明,包含多種類型的 Demo
??????? 2. sql loader的用法 -- 列出了 sql loader 的選擇參數的中文說明
??????? 3. 使用SQL Loader導入大量數據,避免使用SQL頻繁寫庫 -- 一個簡單的例子,快帶了解 Sql Loader 的用法
??????? 4. Oracle SQL Loader的詳細語法
??????? 5. oracle sql loader全攻略 -- 還算名符其實。并講了如何用 SQL *Plus 的 spool 或 UTL_FILE 包生成數據文件
??????? 6. SQL*Loader Control File Reference ?? -- 英文,控制文件使用參考
??????? 7. 學習oracle sql loader 的使用
??????? 8. 用sqlloader(sqlldr)裝載LOB數據 -- LOB 的內類是一個外部文件,用 sql loader 導入到數據庫
??????? 9. SQLLDR直接加載幾個參數的測試
??????? 10. Maximizing SQL*Loader Performance

direct=true 錯誤處理方法 (關于 Oracle 的數據導入導出及 Sql Loader (sqlldr) 的用法


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人免费 | 久久久久久久久国产 | 亚洲国产精品久久 | 国产网站在线 | 免费av一区二区三区 | 三级全黄a| 亚洲精品乱码8久久久久久日本 | 天天操操操操操操 | 亚洲国产日韩在线观频 | 黄色综合 | 91看片淫黄大片欧美看国产片 | 免费中文字幕 | 久草免费在线视频 | 亚洲国产天堂久久综合9999 | 加勒比精品久久一区二区三区 | 日本视频在线 | 一97日本道伊人久久综合影院 | 香港三级日本三级人妇网站 | 欧美日韩在线观看免费 | 日韩欧美在线观看 | 香港三级网站 | 男女在线观看啪网站 | 国产色在线 | 亚洲精品国产电影 | 一区二区三区免费网站 | 久久这里精品 | 自拍偷拍视频网站 | 亚洲国产成人精品女人久久久 | 97av视频| 国产成人啪精品视频免费网站软件 | 国产高清一区二区三区 | 日韩三级中文字幕 | 久草看片| 亚洲午夜精品久久久久久app | 欧美极品在线观看 | 日韩在线精品视频 | 欧美一级精品片在线看 | 爽妇网国产精品 | 99久久自偷自偷国产精品不卡 | 精品久| 国产精品久久久久久久免费 |