2016-12-11 57 views
0

動態識別在外部表動態識別列在外部表

我們有一個過程,其中我們通過SQL裝載機上傳多個法規(例如:美國,菲律賓,拉丁美洲)的員工數據列。 這種情況至少每週發生一次,當前進程是他們每次加載員工信息時都創建一個控制文件, 使用SQL * Loader將其加載到臨時表中。

我希望通過創建一個外部表並運行併發請求將數據放入我們的臨時表來簡化這個過程。 我遇到兩個絆腳石:

有一些列沒有被某些立法使用。

示例:美國使用「Veteran_Information」列,而菲律賓和拉丁美洲則不使用。 菲律賓使用「SSS_Number」,而美國和拉美不使用。 拉丁美洲使用「Medical_Insurance」列,而美國和菲律賓則沒有。 類似下面:

US:  LEGISLATION, EMPLOYEE_NUMBER, DATE_OF_BIRTH, VETERAN_INFORMATION 
PHL: LEGISLATION, EMPLOYEE_NUMBER, DATE_OF_BIRTH, SSS_NUMBER 
LAT: LEGISLATION, EMPLOYEE_NUMBER, DATE_OF_BIRTH, MEDICAL_INSURANCE 

企業用戶不使用標準CSV模板/格式。

由於文件是由非IT業務用戶發送的,它們通常不遵循規定的格式。 (可能是培訓/用戶問題)。 他們往往不遵循 列的正確順序,他們往往沒有按照正確的數量 列的他們往往不遵循列的正確名稱 類似下面:

US:  LEGISLATION, EMPLOYEE_ID, VETERAN_INFORMATION, DATE_OF_BIRTH, EMAIL_ADD 
PHL: EMP_NUM, LEGISLATION, DOB, SSS_NUMBER, EMAIL_ADDRESS 
LAT: LEGISLATION, PS_ID, BIRTH_DATE, EMAIL, MEDICAL_INSURANCE 

外部表有沒有辦法讓外部表識別列的正確順序和命名,即使它們在文件中沒有正確的順序/命名約定?

從問題2以列數據:

US:  LEGISLATION | EMPLOYEE_ID | VETERAN_INFORMATION | DATE_OF_BIRTH | EMAIL_ADD 
     US   | 111   | No     | 1967   | [email protected] 

PHL: EMP_NUM | LEGISLATION | DOB | SSS_NUMBER | EMAIL_ADDRESS 
     222  | PHL   | 1898 | 456789  | [email protected] 

LAT: LEGISLATION | PS_ID  | BIRTH_DATE | EMAIL   | MEDICAL_INSURANCE 
     HON   | 333  | 1956  | [email protected] | Yes 

我想它是這樣的,當它出現在外部表:

LEGISLATION | EMPLOYEE_NUMBER | DATE_OF_BIRTH | VETERAN_INFORMATION | SSS_NUMBER | MEDICAL_INSURANCE | EMAIL_ADDRESS 
    US   | 111    | 1967   | Y     | (NULL)  | (NULL)   | [email protected] 
    PHL   | 222    | 1898   | (NULL)    | 456789  | (NULL)   | [email protected] 
    HON   | 333    | 1956   | (NULL)    | (NULL)  | Yes    | [email protected] 

是否有外接的方式表做類似上面的事情?

在此先感謝!

+1

在Oracle中創建外部表時,必須指定結構/列的順序,即它是固定的。我建議每個文件類型都有一個單獨的表格,然後建立一個合併的視圖/快照來驅動你的本地處理。或者,預處理每個文件以標準化其格式。 – TenG

回答

0

最簡單的是: 對每種輸入類型(US,PHL,HON)使用三種不同的加載腳本。每個腳本只放棄其他兩種記錄類型,並將正確位置的列(可能進行一些轉換,如'否' - >'N'),併爲該記錄類型不存在的列插入NULL。