天天看點

用SQLLDR來裝載date類型的控制檔案

以前給山東某機關做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

   ---------- ---------- ---------------