以前給山東某機關做oracle資料庫恢複得時候,恢複出來得資料中包含date類型,當時給客戶提供得是sqlldr得方式,因為資料量比較大,用sqlldr裝載起來速度比較快,是以采用了這種方式,結果在裝載得時候也出現錯誤,吧解決方法貼出來,做個總結。
資料是這樣得:
|111| |LF0003.lob| |03-JUN-2007 AD 00:00:00|
|222| |LF0004.lob| |01-JUN-2007 AD 00:00:00|
控制檔案是這麼寫的:
load data
infile 'dump001.dat'
insert
into table "BTGL"."LOBDEMO"
("AA01" CHAR(3) enclosed by X'7C' ,
LOBFILE_COL1 FILLER CHAR ,
"AA02" LOBFILE(LOBFILE_COL1) TERMINATED BY EOF NULLIF LOBFILE_COL1 = 'NONE',
"AA03" DATE "DD-MON-YYYY AD HH24:MI:SS" enclosed by X'7C')
結果提示錯誤:
SQL*Loader: Release 9.0.1.1.1 - Production on 星期四 6月 7 12:43:45 2007
(c) Copyright 2001 Oracle Corporation. All rights reserved.
控制檔案: dump001.ctl
資料檔案: dump001.dat
錯誤檔案: dump001.bad
廢棄檔案: 未作指定
:
(可廢棄所有記錄)
加載數: ALL
跳過數: 0
允許的錯誤: 50
綁定數組: 64 行,最大 256000 位元組
繼續: 未作指定
所用路徑: 正常
表"BTGL"."LOBDEMO"
已加載從每個邏輯記錄
插入選項對此表INSERT生效
列名 位置 長度 中止 包裝資料類型
------------------------------ ---------- ----- ---- ---- ---------------------
"AA01" FIRST 3 | CHARACTER
LOBFILE_COL1 NEXT 1 CHARACTER
(FILLER FIELD)
"AA02" DERIVED * EOF CHARACTER
動态 LOBFILE。 檔案名在字段 LOBFILE_COL1 中
NULL if LOBFILE_COL1 =0X4e4f4e45(字元'NONE')
"AA03" NEXT * | DATE DD-MON-YYYY AD HH24:MI:SS
記錄 1: 被拒絕 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出現錯誤。
ORA-01858: 在要求輸入數字處找到非數字字元
記錄 2: 被拒絕 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出現錯誤。
記錄 3: 被拒絕 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出現錯誤。
記錄 4: 被拒絕 - 表 "BTGL"."LOBDEMO" 的列 "AA03" 出現錯誤。
表"BTGL"."LOBDEMO":
0 行加載成功
由于資料錯誤, 4 行沒有加載。
由于所有 WHEN 子句失敗, 0 行沒有加載。
由于所有字段都為空的, 0 行沒有加載。
為結合數組配置設定的空間: 17152位元組(64行)
讀取 緩沖區位元組數: 1048576
跳過的邏輯記錄總數: 0
讀取的邏輯記錄總數: 4
拒絕的邏輯記錄總數: 4
廢棄的邏輯記錄總數: 0
從星期四 6月 07 12:43:45 2007開始運作
在星期四 6月 07 12:43:45 2007處運作結束
經過時間為: 00: 00: 00.15
CPU 時間為: 00: 00: 00.05
---------資料恢複 oracle資料庫恢複專家 13352468096 QQ:9417901 網站:http://www.sosdb.com-----
是CTL檔案寫得有問題
修改ctl檔案為:
FIELDS TERMINATED BY " " OPTIONALLY ENCLOSED BY '|'
TRAILING NULLCOLS
("AA01" CHAR(3) ,
"AA03" DATE "DD-MON-YYYY AD HH24:MI:SS" )
然後運作,出現:
"AA01" FIRST 3 WHT O (|) CHARACTER
LOBFILE_COL1 NEXT * WHT O (|) CHARACTER
"AA03" NEXT * WHT O (|) DATE DD-MON-YYYY AD HH24:MI:SS
ORA-01843: 無效的月份
發現為DATE格式問題,然後設定nls_lang解決問題。
c:\>set nls_lang=amerIcan_america.zhs16gbk
c:\>sqlldr btgl/pass control=dump002.ctl direct=true
檢查發現資料沒問題。
問題解決
[align=right][color=#000066][此貼子已經被admin于2008-6-16 16:32:28編輯過][/color][/align]
在sqlldr中使用資料庫sequence的例子:
In the first example, all of the fields are located in the datafile based on position, which makes this easier.
Another example below covers data that is comma delimited.
We want to load the data into the following table:
SQL> CREATE TABLE load_db_seq_positional
2 (seq_number NUMBER,
3 data1 NUMBER,
4 data2 CHAR(15) );
We will use the following sequence:
SQL> CREATE SEQUENCE db_seq
2 START WITH 1
3 INCREMENT BY 1;
The control file would look like:
LOAD DATA
INFILE *
INTO TABLE load_db_seq_positional
(seq_number "db_seq.nextval",
data1 POSITION(1:5),
data2 POSITION(6:15),
)
BEGINDATA
11111AAAAAAAAAA
22222BBBBBBBBBB
After we run SQL*Loader, our table data looks like:
SQL> SELECT * FROM load_db_seq_positional;
SEQ_NUMBER DATA1 DATA2
---------- ---------- ---------------