2009-05-22 21 views
3

我希望在Oracle數據庫中創建外部表,從服務器上的平面文件檢索其數據。這個文件的格式是不平凡的。該文件中的每一行都可以是幾種不同佈局中的一種,具體取決於行的前綴(前綴本身總是固定長度)。例如,以'TYPE1'開頭的行將具有與以'TYPE2'開頭的行不同的佈局。Oracle外部表:高級平面文件佈局

我讀過外部表可以利用所有可用於SQL加載程序的控制文件的結構。但是,任何文檔我只能讀取接縫來處理普通的平面文件佈局,因此所有行都共享一個通用佈局。

WHEN (1:5) = 'TYPE1' 
(
    field1 POSITION(10:18), 
    field2 POSITION(26:35) 
) 
WHEN (1:5) = 'TYPE2' 
(
    field1 POSITION(23:27), 
    field2 POSITION(15:19) 
) 

我怎樣才能表達使用Oracle的外部表定義的語法這樣的佈局:一個SQL Loader控制文件可以使用WHEN條款很容易處理這種情況?

回答

1

這是從9.2文檔,但您需要LOAD WHEN子句。

http://download.oracle.com/docs/cd/B10500_01/server.920/a96652/ch12.htm

+0

感謝該鏈接,這是非常有用的! :)但是,根據該文檔,LOAD WHEN子句不用於在幾個字段佈局之一之間進行選擇: 「LOAD WHEN condition_spec子句用於標識應傳遞給數據庫的記錄。變化:「 你碰巧有一個這個條款的例子選擇不同的字段佈局,而不是選擇哪些記錄將被導出? – 2009-05-22 17:30:15

0

如果你有固定的記錄試試這個

create table EXT_TABLE 
(
    record_type  char(2), 
    customer_id  char(10), 
    customer_name  char(60), 
    item_id   char(12) 
    quantity   char(10) 
) 
organization external 
(
    type ORACLE_LOADER 
    default directory DIR_FLUX_DEV 
    access parameters 
    (
    RECORDS DELIMITED BY NEWLINE 
    BADFILE 'ext_table.bad' 
    LOGFILE 'ext_table.log' 
    SKIP 0 
    FIELDS 
    (
    TP_REC    position(1:2) char(2), 
    customer_id   position(3:10) char(10), 
    customer_name  position(13:60) char(60), 
    item_id    position(3:12) char(12), 
    quantity    position(15:10) char(10) 
    ) 
) 
    location (DIR_FLUX_DEV:'file.txt') 
) 
reject limit 0; 

那麼你就可以訪問則根據記錄型柱 聲明 光標C1是

select e.* from ext_table; 

begin 
    for r in c1 loop 
    if r.tp_rec = '02' then 
     dbms_output.put_line(r.tp_rec || ' ' || r.customer_id); 
    elsif r.tp_rec = '03' then 
     dbms_output.put_line(r.tp_rec || ' ' || r.item_id); 
    end if; 
    end loop; 
end; 

希望這幫助